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 0000000..325be73 Binary files /dev/null and b/objdiff-core/tests/data/mips/code_be.o differ diff --git a/objdiff-core/tests/data/mips/code_le.o b/objdiff-core/tests/data/mips/code_le.o new file mode 100644 index 0000000..1d55199 Binary files /dev/null and b/objdiff-core/tests/data/mips/code_le.o differ