From 7c4f1c5d130136875814d6c9b559e96b79608c3f Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 8 Mar 2025 10:44:44 -0700 Subject: [PATCH] Fix left/right arch mismatches in diff code --- objdiff-core/src/diff/code.rs | 4 ++-- objdiff-core/tests/arch_mips.rs | 23 +++++++++++++++++++++++ objdiff-core/tests/data/mips/code_be.o | Bin 0 -> 2048 bytes objdiff-core/tests/data/mips/code_le.o | Bin 0 -> 5336 bytes 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 objdiff-core/tests/data/mips/code_be.o create mode 100644 objdiff-core/tests/data/mips/code_le.o diff --git a/objdiff-core/src/diff/code.rs b/objdiff-core/src/diff/code.rs index a372166..6625d35 100644 --- a/objdiff-core/src/diff/code.rs +++ b/objdiff-core/src/diff/code.rs @@ -91,7 +91,7 @@ pub fn diff_code( left_section_idx, diff_config, )?; - let right_ops = left_obj.arch.scan_instructions( + let right_ops = right_obj.arch.scan_instructions( right_symbol.address, right_data, right_section_idx, @@ -437,7 +437,7 @@ fn diff_instruction( { // If either the raw code bytes or relocations don't match, process instructions and compare args let left_ins = left_obj.arch.process_instruction(left_resolved, diff_config)?; - let right_ins = left_obj.arch.process_instruction(right_resolved, diff_config)?; + let right_ins = right_obj.arch.process_instruction(right_resolved, diff_config)?; if left_ins.args.len() != right_ins.args.len() { state.diff_score += PENALTY_REPLACE; return Ok(InstructionDiffResult::new(InstructionDiffKind::Replace)); diff --git a/objdiff-core/tests/arch_mips.rs b/objdiff-core/tests/arch_mips.rs index 80f8c68..a4f2024 100644 --- a/objdiff-core/tests/arch_mips.rs +++ b/objdiff-core/tests/arch_mips.rs @@ -14,3 +14,26 @@ fn read_mips() { let output = common::display_diff(&obj, &diff, symbol_idx, &diff_config); insta::assert_snapshot!(output); } + +#[test] +#[cfg(feature = "mips")] +fn cross_endian_diff() { + let diff_config = diff::DiffObjConfig::default(); + let obj_be = obj::read::parse(include_object!("data/mips/code_be.o"), &diff_config).unwrap(); + assert_eq!(obj_be.endianness, object::Endianness::Big); + let obj_le = obj::read::parse(include_object!("data/mips/code_le.o"), &diff_config).unwrap(); + assert_eq!(obj_le.endianness, object::Endianness::Little); + let left_symbol_idx = obj_be.symbols.iter().position(|s| s.name == "func_00000000").unwrap(); + let right_symbol_idx = + obj_le.symbols.iter().position(|s| s.name == "func_00000000__FPcPc").unwrap(); + let (left_diff, right_diff) = + diff::code::diff_code(&obj_be, &obj_le, left_symbol_idx, right_symbol_idx, &diff_config) + .unwrap(); + // Although the objects differ in endianness, the instructions should match. + assert_eq!(left_diff.instruction_rows[0].kind, diff::InstructionDiffKind::None); + assert_eq!(right_diff.instruction_rows[0].kind, diff::InstructionDiffKind::None); + assert_eq!(left_diff.instruction_rows[1].kind, diff::InstructionDiffKind::None); + assert_eq!(right_diff.instruction_rows[1].kind, diff::InstructionDiffKind::None); + assert_eq!(left_diff.instruction_rows[2].kind, diff::InstructionDiffKind::None); + assert_eq!(right_diff.instruction_rows[2].kind, diff::InstructionDiffKind::None); +} diff --git a/objdiff-core/tests/data/mips/code_be.o b/objdiff-core/tests/data/mips/code_be.o new file mode 100644 index 0000000000000000000000000000000000000000..325be73fd8e202328161ffb94f586a3a6704f5be GIT binary patch literal 2048 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