specter/memory/info/
symbol.rs1use dashmap::DashMap;
4use once_cell::sync::Lazy;
5use std::ffi::CString;
6use thiserror::Error;
7
8#[derive(Error, Debug)]
9pub enum SymbolError {
11 #[error("Symbol not found: {0}")]
13 NotFound(String),
14 #[error("CString error")]
16 StringError,
17}
18
19static CACHE: Lazy<DashMap<String, usize>> = Lazy::new(DashMap::new);
20
21pub fn resolve_symbol(symbol: &str) -> Result<usize, SymbolError> {
29 if let Some(entry) = CACHE.get(symbol) {
30 return Ok(*entry);
31 }
32
33 let c_str = CString::new(symbol).map_err(|_| SymbolError::StringError)?;
34 unsafe {
35 let addr_ptr = libc::dlsym(libc::RTLD_DEFAULT, c_str.as_ptr());
36 if addr_ptr.is_null() {
37 return Err(SymbolError::NotFound(symbol.into()));
38 }
39 let addr = addr_ptr as usize;
40 CACHE.insert(symbol.into(), addr);
41 Ok(addr)
42 }
43}
44
45pub fn cache_symbol(s: &str, a: usize) {
53 CACHE.insert(s.into(), a);
54}
55
56pub fn clear_cache() {
58 CACHE.clear();
59}