in reverie-ptrace/src/vdso.rs [104:135]
fn vdso_get_symbols_info() -> HashMap<String, (u64, usize)> {
let mut res: HashMap<String, (u64, usize)> = HashMap::new();
procfs::process::Process::new(unistd::getpid().as_raw())
.and_then(|p| p.maps())
.unwrap_or_else(|_| Vec::new())
.iter()
.find(|e| e.pathname == procfs::process::MMapPath::Vdso)
.and_then(|vdso| {
let slice = unsafe {
std::slice::from_raw_parts(
vdso.address.0 as *mut u8,
(vdso.address.1 - vdso.address.0) as usize,
)
};
Elf::parse(slice)
.map(|elf| {
let strtab = elf.dynstrtab;
elf.dynsyms.iter().for_each(|sym| {
let sym_name = &strtab[sym.st_name];
if VDSO_SYMBOLS.contains(&sym_name) {
debug_assert!(sym.is_function());
res.insert(
String::from(sym_name),
(sym.st_value, sym.st_size as usize),
);
}
});
})
.ok()
});
res
}