From 5898d7aebf9f7aaa4d59f4d3c96c99dd2d6e81d0 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Mon, 10 Mar 2025 21:51:54 -0600 Subject: [PATCH] Fix section ordering with many same-named sections Before, this was comparing, for example, `.text-2` with `.text-10` with standard string comparison, yielding `.text-10` before `.text-2`. Instead, this simply uses a stable sort by name, which preserves the relative ordering of sections. --- objdiff-core/src/diff/display.rs | 2 +- objdiff-core/tests/arch_x86.rs | 17 +- objdiff-core/tests/data/x86/basenode.obj | Bin 0 -> 7247 bytes .../arch_x86__display_section_ordering.snap | 210 ++++++++++++++++++ 4 files changed, 227 insertions(+), 2 deletions(-) create mode 100644 objdiff-core/tests/data/x86/basenode.obj create mode 100644 objdiff-core/tests/snapshots/arch_x86__display_section_ordering.snap diff --git a/objdiff-core/src/diff/display.rs b/objdiff-core/src/diff/display.rs index ca8ec64..a36c9aa 100644 --- a/objdiff-core/src/diff/display.rs +++ b/objdiff-core/src/diff/display.rs @@ -701,7 +701,7 @@ pub fn display_sections( }); } } - sections.sort_by(|a, b| a.id.cmp(&b.id)); + sections.sort_by(|a, b| a.name.cmp(&b.name)); sections } diff --git a/objdiff-core/tests/arch_x86.rs b/objdiff-core/tests/arch_x86.rs index 717e2b9..5931d95 100644 --- a/objdiff-core/tests/arch_x86.rs +++ b/objdiff-core/tests/arch_x86.rs @@ -1,4 +1,4 @@ -use objdiff_core::{diff, obj}; +use objdiff_core::{diff, diff::display::SymbolFilter, obj}; mod common; @@ -40,3 +40,18 @@ fn read_x86_64() { let output = common::display_diff(&obj, &diff, symbol_idx, &diff_config); insta::assert_snapshot!(output); } + +#[test] +#[cfg(feature = "x86")] +fn display_section_ordering() { + let diff_config = diff::DiffObjConfig::default(); + let obj = obj::read::parse(include_object!("data/x86/basenode.obj"), &diff_config).unwrap(); + let obj_diff = + diff::diff_objs(Some(&obj), None, None, &diff_config, &diff::MappingConfig::default()) + .unwrap() + .left + .unwrap(); + let section_display = + diff::display::display_sections(&obj, &obj_diff, SymbolFilter::None, false, false, false); + insta::assert_debug_snapshot!(section_display); +} diff --git a/objdiff-core/tests/data/x86/basenode.obj b/objdiff-core/tests/data/x86/basenode.obj new file mode 100644 index 0000000000000000000000000000000000000000..6c4d603ba168c8a9abfc83fd745c5a571988fb3a GIT binary patch literal 7247 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 H?*#o9M(CSQ literal 0 HcmV?d00001 diff --git a/objdiff-core/tests/snapshots/arch_x86__display_section_ordering.snap b/objdiff-core/tests/snapshots/arch_x86__display_section_ordering.snap new file mode 100644 index 0000000..39d8a5f --- /dev/null +++ b/objdiff-core/tests/snapshots/arch_x86__display_section_ordering.snap @@ -0,0 +1,210 @@ +--- +source: objdiff-core/tests/arch_x86.rs +expression: section_display +--- +[ + SectionDisplay { + id: ".text-0", + name: ".text", + size: 47, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 28, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-1", + name: ".text", + size: 65, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 29, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-2", + name: ".text", + size: 5, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 30, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-3", + name: ".text", + size: 141, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 31, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-4", + name: ".text", + size: 120, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 34, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-5", + name: ".text", + size: 378, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 37, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-6", + name: ".text", + size: 130, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 38, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-7", + name: ".text", + size: 123, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 39, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-8", + name: ".text", + size: 70, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 40, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-9", + name: ".text", + size: 90, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 41, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-10", + name: ".text", + size: 82, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 42, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-11", + name: ".text", + size: 336, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 43, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-12", + name: ".text", + size: 193, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 50, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-13", + name: ".text", + size: 544, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 53, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-14", + name: ".text", + size: 250, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 56, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-15", + name: ".text", + size: 89, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 57, + is_mapping_symbol: false, + }, + ], + }, + SectionDisplay { + id: ".text-16", + name: ".text", + size: 119, + match_percent: None, + symbols: [ + SectionDisplaySymbol { + symbol: 60, + is_mapping_symbol: false, + }, + ], + }, +]