fn vdso_get_symbols_info()

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
}