From 73917c12a8f8372f69a976461de905c9f3b6505e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid=20Balatoni?= <40299962+dbalatoni13@users.noreply.github.com> Date: Thu, 18 Jun 2026 02:23:34 +0200 Subject: [PATCH] Fix PS2 MWCC line number parsing (#363) --- 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 6046070..f6c8c09 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 dcc0ddd..81e701f 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 zcmb<-^>JflWMqH=Mg|TB1doAX0Ve|kqr)Tx6R-je23ZDXFbfxfte2UAl|c+iAu|If zgE|VIo538)=U`x9U}oTD@PzU~6f=VWLkNfg#mo#s3~^94M7;<@9+VHFm>I+wDnSe= zW@eCNXoj*O>ZKV#G)O3dfq_AYft^7J#9?4yPyqA!8M09LVhjv=DXB@N=?poUd8zRw zsl_D>Y5Dn3!FYtA9+(Lxz>4&8%aapJijh@-&4~x=2CD*+mH#M&WY6^p1QECp<^?D_#6(tY>2n*~Ohyauc zvJN5uVL>c~h``tbq!$_`V9GaK!Phe&SixDrIX|}`Gbgo3LBmMTM9)yqz)+Kcfgy!~ zfkBW#2uzzXGBGePL@;6MVX$Cuwu%WYPAw{q$xcklEY40$j&aFPE(L{OaZGw9O^^(EvfDxed#DtXSAN=2|F2Jz=KLf*tdL{+|6$Sc(Gfq{XAhk-!? zN`ulZhz~Lggv+4*=V4@E5CpqRkr9;E*}!aCg-9R+0|Og_5CaFAt)UEj49*H{3{0{N z3=B<+nRp;97LYI4n}ij(85lt_EFfR7TOegJkoUM5gcw-R3{(V%rw{|Ej0$DoU{GdY zWncuEX2Fn=nv;{yzyb;vCefk6aHOMz%+25|WSG7n@n2>XEusD1zcgE*`V3=IGOgCd(9%mTR%luG{p z2YHGUEC%u~7nlW31Yi~@mKeb9XW|B#1HnuT5OD|(Q~tyMz3QN}#=;<=!pgv;21+*q zNa+Ta9=?Fm1vm{TGJzd_R~4~_X3 z3=9k)V~}D#u{Z@BZm_tAg%yYf$3H7H{&}GB&%?m56BM7U3=I20G!FyAQ7C;8M6*KU zp9dQMJPZur_-BL0KPZYphBGiQSV3t}d_&@&7aW_Q80QDGKr$fz{r?XlLCXLC2gLx0 z1&vRT5(t-p30xCFInZ>)gd`7(Z#D)26-GSq{S__v=o8-`(QE}p6rT77)o8Hzev76R z6hu4>LJTjl#Ro=7Gv*kQ$JAZVU_zDDGosU;x#jAbDi$i)P*f7Kptd^I+}< znFlJhkl5Ww3AoRj0`An*db@G7pruL25zn0{}wGw&MT* literal 0 HcmV?d00001