diff --git a/objdiff-core/src/obj/read.rs b/objdiff-core/src/obj/read.rs index 6046070d..f6c8c093 100644 --- a/objdiff-core/src/obj/read.rs +++ b/objdiff-core/src/obj/read.rs @@ -732,11 +732,11 @@ fn parse_line_info( /// Parse .line section from DWARF 1.1 format. fn parse_line_info_dwarf1(obj_file: &object::File, sections: &mut [Section]) -> Result<()> { - if let Some(section) = obj_file.section_by_name(".line") { + let mut text_sections = sections.iter_mut().filter(|s| s.kind == SectionKind::Code); + for section in obj_file.sections().filter(|s| s.name().is_ok_and(|n| n == ".line")) { let data = section.uncompressed_data()?; let mut reader: &[u8] = data.as_ref(); - let mut text_sections = sections.iter_mut().filter(|s| s.kind == SectionKind::Code); while !reader.is_empty() { let mut section_data = reader; let size = read_u32(obj_file, &mut section_data)? as usize; diff --git a/objdiff-core/tests/arch_mips.rs b/objdiff-core/tests/arch_mips.rs index dcc0ddd2..81e701f2 100644 --- a/objdiff-core/tests/arch_mips.rs +++ b/objdiff-core/tests/arch_mips.rs @@ -80,3 +80,25 @@ fn ido_mdebug_line_numbers() { assert_eq!(text_section.line_info.get(&56), Some(&9)); assert_eq!(text_section.line_info.len(), 66); } + +#[test] +#[cfg(feature = "mips")] +fn mwcc_dwarf1_line_numbers_multiple_functions() { + let diff_config = diff::DiffObjConfig::default(); + let obj = obj::read::parse( + include_object!("data/mips/mwcc_lines_example.o"), + &diff_config, + diff::DiffSide::Base, + ) + .unwrap(); + + for function_name in ["foo", "bar"] { + let symbol = obj.symbols.iter().find(|s| s.name == function_name).unwrap(); + let section_idx = symbol.section.unwrap(); + let section = &obj.sections[section_idx]; + assert!( + section.line_info.values().any(|line| *line > 0), + "{function_name} should have valid line numbers" + ); + } +} diff --git a/objdiff-core/tests/data/mips/mwcc_lines_example.o b/objdiff-core/tests/data/mips/mwcc_lines_example.o new file mode 100644 index 00000000..f7406c2c Binary files /dev/null and b/objdiff-core/tests/data/mips/mwcc_lines_example.o differ