From f8f69e2cfdec0dcb14778c080bbb290b477e5440 Mon Sep 17 00:00:00 2001 From: Amber Brault Date: Sat, 22 Nov 2025 05:35:43 +0100 Subject: [PATCH] Add auto extab dtor renaming (#123) * Add auto extab dtor renaming * Remove whitespace * Update cwextab * Only rename unnamed functions * Create separate name creation function/use is_auto_symbol * Make fmt shut up --- Cargo.lock | 4 ++-- src/analysis/cfa.rs | 7 ++----- src/analysis/tracker.rs | 18 ++++++++++++++++++ src/util/config.rs | 11 +++++++++++ 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c9fe8e0..eb5aa69 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -333,9 +333,9 @@ checksum = "c2e06f9bce634a3c898eb1e5cb949ff63133cbb218af93cc9b38b31d6f3ea285" [[package]] name = "cwextab" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d21b94648643c61e1b5cef71e8d3a9f89350397ac2b0fe42890edbc94757b18" +checksum = "e23dadbc8945746c361e3967336075be7281a5455c06f5c5a17fddca4e7d2175" dependencies = [ "thiserror 2.0.17", ] diff --git a/src/analysis/cfa.rs b/src/analysis/cfa.rs index 1a7bf5c..68e99a8 100644 --- a/src/analysis/cfa.rs +++ b/src/analysis/cfa.rs @@ -20,6 +20,7 @@ use crate::{ ObjInfo, ObjSectionKind, ObjSymbol, ObjSymbolFlagSet, ObjSymbolFlags, ObjSymbolKind, SectionIndex, }, + util::config::create_auto_symbol_name, }; #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] @@ -143,11 +144,7 @@ impl AnalyzerState { section.address, section.address + section.size ); - let name = if obj.module_id == 0 { - format!("fn_{:08X}", start.address) - } else { - format!("fn_{}_{:X}", obj.module_id, start.address) - }; + let name = create_auto_symbol_name("fn", obj.module_id, start.address); obj.add_symbol( ObjSymbol { name, diff --git a/src/analysis/tracker.rs b/src/analysis/tracker.rs index 1ce172c..9b09fea 100644 --- a/src/analysis/tracker.rs +++ b/src/analysis/tracker.rs @@ -21,6 +21,7 @@ use crate::{ ObjDataKind, ObjInfo, ObjKind, ObjReloc, ObjRelocKind, ObjSection, ObjSectionKind, ObjSymbol, ObjSymbolFlagSet, ObjSymbolFlags, ObjSymbolKind, SectionIndex, SymbolIndex, }, + util::config::{create_auto_symbol_name, is_auto_symbol}, }; #[derive(Debug, Copy, Clone)] @@ -822,6 +823,23 @@ impl Tracker { } } } + + // Rename all discovered extab dtors from extab relocations + if let Some((_, extab_section)) = obj.sections.by_name("extab")? { + for (_, reloc) in extab_section.relocations.iter() { + let symbol = &obj.symbols[reloc.target_symbol]; + // Only rename auto symbols + if is_auto_symbol(symbol) { + let mut new_symbol = symbol.clone(); + let name = + create_auto_symbol_name("dtor", obj.module_id, symbol.address as u32); + + new_symbol.name = name; + obj.symbols.replace(reloc.target_symbol, new_symbol)?; + } + } + } + Ok(()) } } diff --git a/src/util/config.rs b/src/util/config.rs index 86a75bc..bd61338 100644 --- a/src/util/config.rs +++ b/src/util/config.rs @@ -176,6 +176,16 @@ pub fn parse_symbol_line(line: &str, obj: &mut ObjInfo) -> Result String { + let name = if module_id == 0 { + format!("{}_{:08X}", prefix, address) + } else { + format!("{}_{}_{:X}", prefix, module_id, address) + }; + + name +} + pub fn is_skip_symbol(symbol: &ObjSymbol) -> bool { if symbol.flags.is_no_write() { return true; @@ -194,6 +204,7 @@ pub fn is_auto_symbol(symbol: &ObjSymbol) -> bool { || symbol.name.starts_with("jumptable_") || symbol.name.starts_with("gap_") || symbol.name.starts_with("pad_") + || symbol.name.starts_with("dtor_") } pub fn is_auto_label(symbol: &ObjSymbol) -> bool { symbol.name.starts_with("lbl_") }