Skip to content

Commit fd555a6

Browse files
committed
Fix reading little-endian .line section
1 parent 3710b6a commit fd555a6

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

objdiff-core/src/obj/read.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::{collections::HashSet, fs, io::Cursor, path::Path};
22

33
use anyhow::{anyhow, bail, ensure, Context, Result};
4-
use byteorder::{BigEndian, ReadBytesExt};
54
use cwextab::decode_extab;
65
use filetime::FileTime;
76
use flagset::Flags;
@@ -18,6 +17,7 @@ use crate::{
1817
ObjExtab, ObjInfo, ObjReloc, ObjSection, ObjSectionKind, ObjSymbol, ObjSymbolFlagSet,
1918
ObjSymbolFlags,
2019
},
20+
util::{read_u16, read_u32},
2121
};
2222

2323
fn to_obj_section_kind(kind: SectionKind) -> Option<ObjSectionKind> {
@@ -415,8 +415,8 @@ fn line_info(obj_file: &File<'_>, sections: &mut [ObjSection]) -> Result<()> {
415415
.index()
416416
.0;
417417
let start = reader.position();
418-
let size = reader.read_u32::<BigEndian>()?;
419-
let base_address = reader.read_u32::<BigEndian>()? as u64;
418+
let size = read_u32(obj_file, &mut reader)?;
419+
let base_address = read_u32(obj_file, &mut reader)? as u64;
420420
let Some(out_section) =
421421
sections.iter_mut().find(|s| s.orig_index == text_section_index)
422422
else {
@@ -426,12 +426,12 @@ fn line_info(obj_file: &File<'_>, sections: &mut [ObjSection]) -> Result<()> {
426426
};
427427
let end = start + size as u64;
428428
while reader.position() < end {
429-
let line_number = reader.read_u32::<BigEndian>()? as u64;
430-
let statement_pos = reader.read_u16::<BigEndian>()?;
429+
let line_number = read_u32(obj_file, &mut reader)? as u64;
430+
let statement_pos = read_u16(obj_file, &mut reader)?;
431431
if statement_pos != 0xFFFF {
432432
log::warn!("Unhandled statement pos {}", statement_pos);
433433
}
434-
let address_delta = reader.read_u32::<BigEndian>()? as u64;
434+
let address_delta = read_u32(obj_file, &mut reader)? as u64;
435435
out_section.line_info.insert(base_address + address_delta, line_number);
436436
log::debug!("Line: {:#x} -> {}", base_address + address_delta, line_number);
437437
}

objdiff-core/src/util.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1-
use std::fmt::{LowerHex, UpperHex};
1+
use std::{
2+
fmt::{LowerHex, UpperHex},
3+
io::Read,
4+
};
25

6+
use anyhow::Result;
7+
use byteorder::{NativeEndian, ReadBytesExt};
38
use num_traits::PrimInt;
9+
use object::{Endian, Object};
410

511
// https://stackoverflow.com/questions/44711012/how-do-i-format-a-signed-integer-to-a-sign-aware-hexadecimal-representation
612
pub(crate) struct ReallySigned<N: PrimInt>(pub(crate) N);
@@ -22,3 +28,11 @@ impl<N: PrimInt> UpperHex for ReallySigned<N> {
2228
f.pad_integral(num >= 0, prefix, &bare_hex)
2329
}
2430
}
31+
32+
pub fn read_u32<R: Read>(obj_file: &object::File, reader: &mut R) -> Result<u32> {
33+
Ok(obj_file.endianness().read_u32(reader.read_u32::<NativeEndian>()?))
34+
}
35+
36+
pub fn read_u16<R: Read>(obj_file: &object::File, reader: &mut R) -> Result<u16> {
37+
Ok(obj_file.endianness().read_u16(reader.read_u16::<NativeEndian>()?))
38+
}

0 commit comments

Comments
 (0)