dol diff: Conditionally warn on symbol size mismatch

When a symbol's data matches but the size differs
due to padding bytes, print a warning and continue.

Resolves #35
This commit is contained in:
Luke Street 2025-01-27 18:56:24 -07:00
parent e55ade10ec
commit b9642321a1

View File

@ -1720,7 +1720,7 @@ fn diff(args: DiffArgs) -> Result<()> {
); );
} }
found = true; found = true;
} else if linked_sym.kind == orig_sym.kind && linked_sym.size == orig_sym.size { } else if linked_sym.kind == orig_sym.kind {
// Fuzzy match // Fuzzy match
let orig_data = orig_section.data_range( let orig_data = orig_section.data_range(
orig_sym.address as u32, orig_sym.address as u32,
@ -1730,7 +1730,12 @@ fn diff(args: DiffArgs) -> Result<()> {
linked_sym.address as u32, linked_sym.address as u32,
linked_sym.address as u32 + linked_sym.size as u32, linked_sym.address as u32 + linked_sym.size as u32,
)?; )?;
if orig_data == linked_data { let len = orig_data.len().min(linked_data.len());
if orig_data[..len] == linked_data[..len]
// Ignore padding differences
&& orig_data[len..].iter().all(|&b| b == 0)
&& linked_data[len..].iter().all(|&b| b == 0)
{
found = true; found = true;
} }
} }
@ -1794,7 +1799,11 @@ fn diff(args: DiffArgs) -> Result<()> {
linked_sym.address as u32, linked_sym.address as u32,
linked_sym.address as u32 + linked_sym.size as u32, linked_sym.address as u32 + linked_sym.size as u32,
)?; )?;
if orig_data != linked_data { let len = orig_data.len().min(linked_data.len());
if orig_data[..len] != linked_data[..len]
|| orig_data[len..].iter().any(|&b| b != 0)
|| linked_data[len..].iter().any(|&b| b != 0)
{
log::error!( log::error!(
"Data mismatch for {} (type {:?}, size {:#X}) at {:#010X}", "Data mismatch for {} (type {:?}, size {:#X}) at {:#010X}",
orig_sym.name, orig_sym.name,
@ -1834,6 +1843,15 @@ fn diff(args: DiffArgs) -> Result<()> {
} }
std::process::exit(1); std::process::exit(1);
} else if orig_data.len() != linked_data.len() {
log::error!(
"Size mismatch for {} (type {:?}) at {:#010X}: Expected {:#X}, found {:#X}",
orig_sym.name,
orig_sym.kind,
orig_sym.address,
orig_data.len(),
linked_data.len()
);
} }
} }