Skip to content

Commit 636a8e0

Browse files
committed
Fix diffing across mismatched .text sections
1 parent cd46be7 commit 636a8e0

File tree

1 file changed

+36
-23
lines changed

1 file changed

+36
-23
lines changed

src/diff.rs

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -362,20 +362,26 @@ fn compare_ins(
362362
Ok(result)
363363
}
364364

365-
fn find_symbol<'a>(symbols: &'a mut [ObjSymbol], name: &str) -> Option<&'a mut ObjSymbol> {
366-
symbols.iter_mut().find(|s| s.name == name)
365+
fn find_section_and_symbol(obj: &ObjInfo, name: &str) -> Option<(usize, usize)> {
366+
for (section_idx, section) in obj.sections.iter().enumerate() {
367+
let symbol_idx = match section.symbols.iter().position(|symbol| symbol.name == name) {
368+
Some(symbol_idx) => symbol_idx,
369+
None => continue,
370+
};
371+
return Some((section_idx, symbol_idx));
372+
}
373+
None
367374
}
368375

369376
pub fn diff_objs(left: &mut ObjInfo, right: &mut ObjInfo, _diff_config: &DiffConfig) -> Result<()> {
370377
for left_section in &mut left.sections {
371-
let Some(right_section) = right.sections.iter_mut().find(|s| s.name == left_section.name) else {
372-
continue;
373-
};
374378
if left_section.kind == ObjSectionKind::Code {
375379
for left_symbol in &mut left_section.symbols {
376-
if let Some(right_symbol) =
377-
find_symbol(&mut right_section.symbols, &left_symbol.name)
380+
if let Some((right_section_idx, right_symbol_idx)) =
381+
find_section_and_symbol(right, &left_symbol.name)
378382
{
383+
let right_section = &mut right.sections[right_section_idx];
384+
let right_symbol = &mut right_section.symbols[right_symbol_idx];
379385
left_symbol.diff_symbol = Some(right_symbol.name.clone());
380386
right_symbol.diff_symbol = Some(left_symbol.name.clone());
381387
diff_code(
@@ -399,22 +405,29 @@ pub fn diff_objs(left: &mut ObjInfo, right: &mut ObjInfo, _diff_config: &DiffCon
399405
)?;
400406
}
401407
}
402-
for right_symbol in &mut right_section.symbols {
403-
if right_symbol.instructions.is_empty() {
404-
no_diff_code(
405-
left.architecture,
406-
&right_section.data,
407-
right_symbol,
408-
&right_section.relocations,
409-
&left.line_info,
410-
)?;
411-
}
408+
} else {
409+
let Some(right_section) = right.sections.iter_mut().find(|s| s.name == left_section.name) else {
410+
continue;
411+
};
412+
if left_section.kind == ObjSectionKind::Data {
413+
diff_data(left_section, right_section);
414+
// diff_data_symbols(left_section, right_section)?;
415+
} else if left_section.kind == ObjSectionKind::Bss {
416+
diff_bss_symbols(&mut left_section.symbols, &mut right_section.symbols)?;
417+
}
418+
}
419+
}
420+
for right_section in right.sections.iter_mut().filter(|s| s.kind == ObjSectionKind::Code) {
421+
for right_symbol in &mut right_section.symbols {
422+
if right_symbol.instructions.is_empty() {
423+
no_diff_code(
424+
right.architecture,
425+
&right_section.data,
426+
right_symbol,
427+
&right_section.relocations,
428+
&right.line_info,
429+
)?;
412430
}
413-
} else if left_section.kind == ObjSectionKind::Data {
414-
diff_data(left_section, right_section);
415-
// diff_data_symbols(left_section, right_section)?;
416-
} else if left_section.kind == ObjSectionKind::Bss {
417-
diff_bss_symbols(&mut left_section.symbols, &mut right_section.symbols)?;
418431
}
419432
}
420433
diff_bss_symbols(&mut left.common, &mut right.common)?;
@@ -423,7 +436,7 @@ pub fn diff_objs(left: &mut ObjInfo, right: &mut ObjInfo, _diff_config: &DiffCon
423436

424437
fn diff_bss_symbols(left_symbols: &mut [ObjSymbol], right_symbols: &mut [ObjSymbol]) -> Result<()> {
425438
for left_symbol in left_symbols {
426-
if let Some(right_symbol) = find_symbol(right_symbols, &left_symbol.name) {
439+
if let Some(right_symbol) = right_symbols.iter_mut().find(|s| s.name == left_symbol.name) {
427440
left_symbol.diff_symbol = Some(right_symbol.name.clone());
428441
right_symbol.diff_symbol = Some(left_symbol.name.clone());
429442
let percent = if left_symbol.size == right_symbol.size { 100.0 } else { 50.0 };

0 commit comments

Comments
 (0)