From d6c3340a5989b7d3e1aa19f0ceff9eeb1dc26383 Mon Sep 17 00:00:00 2001 From: dbalatoni13 <40299962+dbalatoni13@users.noreply.github.com> Date: Mon, 8 Jun 2026 02:22:13 +0200 Subject: [PATCH] Fix PS2 MWCC line number parsing --- objdiff-core/src/obj/read.rs | 4 ++-- objdiff-core/tests/arch_mips.rs | 22 ++++++++++++++++++ .../tests/data/mips/mwcc_lines_example.o | Bin 0 -> 3624 bytes 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 objdiff-core/tests/data/mips/mwcc_lines_example.o 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 0000000000000000000000000000000000000000..f7406c2c26443f1bed673f672484ba8122a94aaa GIT binary patch literal 3624 zcmc&$O>9(E6h7~DXp1c{1r(8>k4P+PG66!cK^K#>HX*SFqm3*k)S2l(N9L!QnTkXs zO=Y7S8{^7V6J5HPr7jR-!p4ntp&J*@PE0hxMAzf@op(>?zDI=>dXoFj&pki)-tXKy zbM3{KW`iIQqd-Pwpowhk6bbSlN2k=`m>iZNbKREvu|u*$9`U?}WT#9f^f7tP>7(F7 zvP;e;=CkrzLf5K~lV@^d+uU{z_J8j=X^DJnz`l;mHD3^*Y%d4U~spOm}V?FJw z^-i$_-f6{r$)s|#UavGdw&Yx^Qgf@%bt-SePD3okoANzaF7}9}xM*xK`G1OakSLpb zJ(@dv?$u~Inr_yYtF=liI(9O5Dt97x{KV7nSj3nBs^q7G5a09R-7zvH(`O3v?Mka% zxLhn%+n0;w!c4Qg!t-kvE>$}Vl zi^e42OeUf})ZGc(bh>z3ez^_JO)!L6ivgh)P@?qxyYr3ePE| z2;YZPn!%UU?-QkX?Odl(D6!pi*74`>px@YQ8T8r?37=x$WWBzze)tP<)(;Wn2ip(N zvjSkcld4L{2K_L=U;AN7pH@Tu_f+T;(24wQ@D%dJ_Tm=iJRhGFe?W2_MzmjyKloSF zVZZ6@w;cb$*%g2IDgNM!|FFZK5IZ{KI9z}sm0cb}PG)=(Z`*q>RHzZAmU|?;dE*9~)DIPxx z8P{gnOq=jqG{xi3LgpHc^6t%L4ZC(c>(dyt;YuoyFk-@6#BVdwV^{37T^c7AIxU}_7u9+d6+-~;&ib$du` z=VG~7_mfnYroy=d$kn`1X?QT)u$p=iBh|@y?T& z?@J8-T)Oa!U^BA4d<}ztE}QV