mirror of
https://github.com/encounter/decomp-toolkit.git
synced 2025-12-12 14:46:17 +00:00
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
This commit is contained in:
4
Cargo.lock
generated
4
Cargo.lock
generated
@@ -333,9 +333,9 @@ checksum = "c2e06f9bce634a3c898eb1e5cb949ff63133cbb218af93cc9b38b31d6f3ea285"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cwextab"
|
name = "cwextab"
|
||||||
version = "1.1.6"
|
version = "1.1.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1d21b94648643c61e1b5cef71e8d3a9f89350397ac2b0fe42890edbc94757b18"
|
checksum = "e23dadbc8945746c361e3967336075be7281a5455c06f5c5a17fddca4e7d2175"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror 2.0.17",
|
"thiserror 2.0.17",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ use crate::{
|
|||||||
ObjInfo, ObjSectionKind, ObjSymbol, ObjSymbolFlagSet, ObjSymbolFlags, ObjSymbolKind,
|
ObjInfo, ObjSectionKind, ObjSymbol, ObjSymbolFlagSet, ObjSymbolFlags, ObjSymbolKind,
|
||||||
SectionIndex,
|
SectionIndex,
|
||||||
},
|
},
|
||||||
|
util::config::create_auto_symbol_name,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
@@ -143,11 +144,7 @@ impl AnalyzerState {
|
|||||||
section.address,
|
section.address,
|
||||||
section.address + section.size
|
section.address + section.size
|
||||||
);
|
);
|
||||||
let name = if obj.module_id == 0 {
|
let name = create_auto_symbol_name("fn", obj.module_id, start.address);
|
||||||
format!("fn_{:08X}", start.address)
|
|
||||||
} else {
|
|
||||||
format!("fn_{}_{:X}", obj.module_id, start.address)
|
|
||||||
};
|
|
||||||
obj.add_symbol(
|
obj.add_symbol(
|
||||||
ObjSymbol {
|
ObjSymbol {
|
||||||
name,
|
name,
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ use crate::{
|
|||||||
ObjDataKind, ObjInfo, ObjKind, ObjReloc, ObjRelocKind, ObjSection, ObjSectionKind,
|
ObjDataKind, ObjInfo, ObjKind, ObjReloc, ObjRelocKind, ObjSection, ObjSectionKind,
|
||||||
ObjSymbol, ObjSymbolFlagSet, ObjSymbolFlags, ObjSymbolKind, SectionIndex, SymbolIndex,
|
ObjSymbol, ObjSymbolFlagSet, ObjSymbolFlags, ObjSymbolKind, SectionIndex, SymbolIndex,
|
||||||
},
|
},
|
||||||
|
util::config::{create_auto_symbol_name, is_auto_symbol},
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,6 +176,16 @@ pub fn parse_symbol_line(line: &str, obj: &mut ObjInfo) -> Result<Option<ObjSymb
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn create_auto_symbol_name(prefix: &str, module_id: u32, address: u32) -> 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 {
|
pub fn is_skip_symbol(symbol: &ObjSymbol) -> bool {
|
||||||
if symbol.flags.is_no_write() {
|
if symbol.flags.is_no_write() {
|
||||||
return true;
|
return true;
|
||||||
@@ -194,6 +204,7 @@ pub fn is_auto_symbol(symbol: &ObjSymbol) -> bool {
|
|||||||
|| symbol.name.starts_with("jumptable_")
|
|| symbol.name.starts_with("jumptable_")
|
||||||
|| symbol.name.starts_with("gap_")
|
|| symbol.name.starts_with("gap_")
|
||||||
|| symbol.name.starts_with("pad_")
|
|| symbol.name.starts_with("pad_")
|
||||||
|
|| symbol.name.starts_with("dtor_")
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_auto_label(symbol: &ObjSymbol) -> bool { symbol.name.starts_with("lbl_") }
|
pub fn is_auto_label(symbol: &ObjSymbol) -> bool { symbol.name.starts_with("lbl_") }
|
||||||
|
|||||||
Reference in New Issue
Block a user