#![allow(warnings)]
mod utils;
use std::env;
use std::path::PathBuf;
use std::str::FromStr;
fn has_dyld_shared_cache_samples() -> bool {
let dsc_dir = utils::get_sample_path().join("dyld_shared_cache");
if dsc_dir.is_dir() {
return true;
}
if let Some(dir) = env::var_os("LIEF_DSC_SAMPLES_DIR") {
return PathBuf::from_str(&dir.into_string().unwrap_or("".to_string()))
.unwrap()
.is_dir();
}
return false;
}
fn get_dsc_sample(suffix: &str) -> PathBuf {
let dir = utils::get_sample_path().join("dyld_shared_cache");
if dir.is_dir() {
return dir.join(suffix);
}
let env_dir = env::var_os("LIEF_DSC_SAMPLES_DIR")
.unwrap()
.into_string()
.unwrap();
PathBuf::from_str(&env_dir).unwrap().join(suffix)
}
fn explore_dylib(cache: &lief::dsc::DyldSharedCache, dylib: &lief::dsc::Dylib) {
println!("{:?}", dylib);
}
fn explore_mapping_info(cache: &lief::dsc::DyldSharedCache, info: &lief::dsc::MappingInfo) {
println!("{:?}", info);
}
fn explore_subcache(cache: &lief::dsc::DyldSharedCache, sc: &lief::dsc::SubCache) {
println!("{:?}", sc);
}
fn run_ios_181(cache: &lief::dsc::DyldSharedCache) {
println!("{}", cache.filename());
println!("{}", cache.filepath());
println!("{}", cache.load_address());
println!("{:?}", cache.version());
println!("{}", cache.arch_name());
println!("{:?}", cache.platform());
println!("{:?}", cache.arch());
assert!(cache.find_lib_from_va(0x20d0a4010).is_some());
assert!(cache.find_lib_from_va(0).is_none());
assert!(
cache
.find_lib_from_path("/usr/lib/libobjc.A.dylib")
.is_some()
);
assert!(
cache
.find_lib_from_path("/usr/lib/libobjc.X.dylib")
.is_none()
);
assert!(cache.find_lib_from_name("liblockdown.dylib").is_some());
assert!(cache.find_lib_from_path("liblockdown.A.dylib").is_none());
assert!(cache.has_subcaches());
for dylib in cache.libraries() {
explore_dylib(cache, &dylib);
}
for sc in cache.subcaches() {
explore_subcache(cache, &sc);
for info in sc.cache().expect("Missing cache").mapping_info() {
explore_mapping_info(cache, &info);
}
}
}
#[test]
fn test_api() {
if !lief::is_extended() || !has_dyld_shared_cache_samples() {
return;
}
let cache = lief::dsc::load_from_path(
get_dsc_sample("ios-18.1/").to_str().unwrap(),
"",
);
assert!(cache.is_some());
run_ios_181(&cache.unwrap());
}