From 8726b94122f8591bc9cdf7b9fd186fae0d2fa795 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Mon, 24 Feb 2025 01:15:41 +0200 Subject: [PATCH] list output call sites --- crates/vestal/src/call_sites.rs | 4 +++- crates/vestal/src/main.rs | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/crates/vestal/src/call_sites.rs b/crates/vestal/src/call_sites.rs index db4c67f..379d29b 100644 --- a/crates/vestal/src/call_sites.rs +++ b/crates/vestal/src/call_sites.rs @@ -60,7 +60,7 @@ impl Module { fn call_site (self: &Arc, position: usize, opcodes: &[u8]) -> Usually> { let group = false; let offset = (position + self.code_start) as u32; - let source = self.pe.offset_to_rva(Offset((position + self.code_start) as u32))?.0; + let source = self.pe.offset_to_rva(Offset(offset))?.0; let target = CallSite::target(source, opcodes).unwrap_or(0); let import = self.imports.read().unwrap().get(&target).cloned(); let call_site = Arc::new(CallSite { @@ -85,6 +85,8 @@ impl Module { targets.insert(call_site.target, vec![]); } targets.get_mut(&call_site.target).unwrap().push(call_site.clone()); + let mut call_sites = self.call_sites.write().unwrap(); + call_sites.insert(call_site.source, call_site.clone()); } /// Follow the call site and resolve the next call site found in the dependency. fn load_call_site_recurse (self: &Arc, call_site: &Arc, depth: usize) -> Usually<()> { diff --git a/crates/vestal/src/main.rs b/crates/vestal/src/main.rs index d440168..dca5fe9 100644 --- a/crates/vestal/src/main.rs +++ b/crates/vestal/src/main.rs @@ -48,7 +48,7 @@ pub struct Module { /// Addresses of exported methods by name pub exports: RwLock, ThunkData>>, /// Locations in `.text` section that need to be patched - pub call_sites: BTreeMap>, + pub call_sites: RwLock>>, /// More detailed output. pub verbose: bool, } @@ -169,6 +169,11 @@ impl Module { module.name); layout.insert(index, self.clone()); index += module.code_size.div_ceil(page) * page; + for (addr, call) in module.call_sites.read().unwrap().iter() { + println!(" {} {:?}::{:?}", fmt_num(*addr as usize), + call.module.as_ref().map(|m|m.name.clone()), + call.method); + } }; append(&self); for module in self.namespace.read().unwrap().values() {