diff --git a/objdiff-core/src/diff/data.rs b/objdiff-core/src/diff/data.rs index 9cfa045..514287f 100644 --- a/objdiff-core/src/diff/data.rs +++ b/objdiff-core/src/diff/data.rs @@ -274,7 +274,6 @@ pub fn diff_data_section( // We only do this when all relocations on the left side match. if left_section_diff.match_percent.unwrap_or(-1.0) < match_percent { left_section_diff.match_percent = Some(match_percent); - right_section_diff.match_percent = Some(match_percent); } } Ok((left_section_diff, right_section_diff)) @@ -413,7 +412,7 @@ pub fn diff_generic_section( }; Ok(( SectionDiff { match_percent: Some(match_percent), data_diff: vec![], reloc_diff: vec![] }, - SectionDiff { match_percent: Some(match_percent), data_diff: vec![], reloc_diff: vec![] }, + SectionDiff { match_percent: None, data_diff: vec![], reloc_diff: vec![] }, )) } @@ -454,7 +453,7 @@ pub fn diff_bss_section( Ok(( SectionDiff { match_percent: Some(match_percent), data_diff: vec![], reloc_diff: vec![] }, - SectionDiff { match_percent: Some(match_percent), data_diff: vec![], reloc_diff: vec![] }, + SectionDiff { match_percent: None, data_diff: vec![], reloc_diff: vec![] }, )) } diff --git a/objdiff-core/src/diff/display.rs b/objdiff-core/src/diff/display.rs index 4e33c58..bbac421 100644 --- a/objdiff-core/src/diff/display.rs +++ b/objdiff-core/src/diff/display.rs @@ -600,9 +600,7 @@ fn symbol_matches_filter( return false; } if !show_hidden_symbols - && (symbol.size == 0 - || symbol.flags.contains(SymbolFlag::Hidden) - || symbol.flags.contains(SymbolFlag::Ignored)) + && (symbol.size == 0 || symbol.flags.contains(SymbolFlag::Hidden | SymbolFlag::Ignored)) { return false; } diff --git a/objdiff-core/src/diff/mod.rs b/objdiff-core/src/diff/mod.rs index 43f59d9..c34588d 100644 --- a/objdiff-core/src/diff/mod.rs +++ b/objdiff-core/src/diff/mod.rs @@ -658,7 +658,11 @@ fn find_symbol( /// Find matching sections between each object. fn matching_sections(left: Option<&Object>, right: Option<&Object>) -> Result> { - let mut matches = Vec::new(); + let mut matches = Vec::with_capacity( + left.as_ref() + .map_or(0, |o| o.sections.len()) + .max(right.as_ref().map_or(0, |o| o.sections.len())), + ); if let Some(left) = left { for (section_idx, section) in left.sections.iter().enumerate() { if section.kind == SectionKind::Unknown { @@ -666,7 +670,7 @@ fn matching_sections(left: Option<&Object>, right: Option<&Object>) -> Result, right: Option<&Object>) -> Result, name: &str, section_kind: SectionKind) -> Option { - obj?.sections.iter().position(|s| s.kind == section_kind && s.name == name) +fn find_section( + obj: Option<&Object>, + name: &str, + section_kind: SectionKind, + matches: &[SectionMatch], +) -> Option { + obj?.sections.iter().enumerate().position(|(i, s)| { + s.kind == section_kind && s.name == name && !matches.iter().any(|m| m.right == Some(i)) + }) }