mirror of
https://github.com/encounter/decomp-toolkit.git
synced 2025-12-12 22:56:28 +00:00
Add links field to config for overriding REL linkage
By default, every REL is linked with every other REL. Some games, like Mario Party, link RELs individually, so the module IDs are not unique. To support this, the `links` field can be used to override which _other_ modules are included in a module's analysis.
This commit is contained in:
@@ -328,7 +328,12 @@ impl AnalyzerState {
|
||||
log::trace!("Finalizing {:#010X}", addr);
|
||||
slices.finalize(obj, &self.functions)?;
|
||||
for address in slices.function_references.iter().cloned() {
|
||||
self.functions.entry(address).or_default();
|
||||
// Only create functions for code sections
|
||||
// Some games use branches to data sections to prevent dead stripping (Mario Party)
|
||||
if matches!(obj.sections.get(address.section), Some(section) if section.kind == ObjSectionKind::Code)
|
||||
{
|
||||
self.functions.entry(address).or_default();
|
||||
}
|
||||
}
|
||||
self.jump_tables.append(&mut slices.jump_table_references.clone());
|
||||
let end = slices.end();
|
||||
@@ -366,7 +371,12 @@ impl AnalyzerState {
|
||||
pub fn process_function_at(&mut self, obj: &ObjInfo, addr: SectionAddress) -> Result<bool> {
|
||||
Ok(if let Some(mut slices) = self.process_function(obj, addr)? {
|
||||
for address in slices.function_references.iter().cloned() {
|
||||
self.functions.entry(address).or_default();
|
||||
// Only create functions for code sections
|
||||
// Some games use branches to data sections to prevent dead stripping (Mario Party)
|
||||
if matches!(obj.sections.get(address.section), Some(section) if section.kind == ObjSectionKind::Code)
|
||||
{
|
||||
self.functions.entry(address).or_default();
|
||||
}
|
||||
}
|
||||
self.jump_tables.append(&mut slices.jump_table_references.clone());
|
||||
if slices.can_finalize() {
|
||||
|
||||
@@ -118,7 +118,7 @@ pub struct FindRelCtorsDtors {}
|
||||
impl AnalysisPass for FindRelCtorsDtors {
|
||||
fn execute(state: &mut AnalyzerState, obj: &ObjInfo) -> Result<()> {
|
||||
ensure!(obj.kind == ObjKind::Relocatable);
|
||||
ensure!(!obj.unresolved_relocations.is_empty());
|
||||
// ensure!(!obj.unresolved_relocations.is_empty());
|
||||
|
||||
match (obj.sections.by_name(".ctors")?, obj.sections.by_name(".dtors")?) {
|
||||
(Some(_), Some(_)) => return Ok(()),
|
||||
|
||||
Reference in New Issue
Block a user