use crate::check_shlibs::{CheckShlibs, CheckState};
use crate::check_shlibs::{check_pkg, check_shlib};
use goblin::mach::{Mach, SingleArch};
use std::path::Path;
impl CheckShlibs {
pub fn check_dso(
&self,
path: &Path,
object: &[u8],
state: &mut CheckState,
) -> anyhow::Result<()> {
let pobj = match Mach::parse(object) {
Ok(o) => o,
Err(_) => return Ok(()),
};
let obj = match pobj {
Mach::Fat(fat) => {
if let Ok(SingleArch::MachO(o)) = fat.get(0) {
o
} else {
return Ok(());
}
}
Mach::Binary(bin) => bin,
};
let skip = usize::from(obj.name.is_none());
for lib in obj.libs.into_iter().skip(skip) {
if std::env::var("SKIP_SYSTEM_LIBS").is_ok()
&& (lib.starts_with("/System/Library")
|| lib.starts_with("/usr/lib"))
{
continue;
}
let mut libpath = state.destdir.clone();
match lib.strip_prefix("/") {
Some(p) => libpath.push(p),
None => libpath.push(lib),
}
let exists = match state.statlibs.get(&libpath) {
Some(e) => *e,
None => {
let e = libpath.exists();
state.statlibs.insert(libpath.to_path_buf(), e);
e
}
};
if exists {
continue;
}
let libpath = Path::new(lib);
let exists = match state.statlibs.get(libpath) {
Some(e) => *e,
None => {
let e = libpath.exists();
state.statlibs.insert(libpath.to_path_buf(), e);
e
}
};
if exists {
check_shlib(path, libpath, state);
check_pkg(path, libpath, state)?;
continue;
}
println!("{}: missing library: {}", path.display(), lib);
}
Ok(())
}
}