(
left_obj: &Object,
right_obj: &Object,
left_symbol_idx: usize,
right_symbol_idx: usize,
)
| 361 | } |
| 362 | |
| 363 | pub fn diff_data_symbol( |
| 364 | left_obj: &Object, |
| 365 | right_obj: &Object, |
| 366 | left_symbol_idx: usize, |
| 367 | right_symbol_idx: usize, |
| 368 | ) -> Result<(SymbolDiff, SymbolDiff)> { |
| 369 | let left_symbol = &left_obj.symbols[left_symbol_idx]; |
| 370 | let right_symbol = &right_obj.symbols[right_symbol_idx]; |
| 371 | |
| 372 | let left_section_idx = |
| 373 | left_symbol.section.ok_or_else(|| anyhow!("Data symbol section not found"))?; |
| 374 | let right_section_idx = |
| 375 | right_symbol.section.ok_or_else(|| anyhow!("Data symbol section not found"))?; |
| 376 | |
| 377 | let left_section = &left_obj.sections[left_section_idx]; |
| 378 | let right_section = &right_obj.sections[right_section_idx]; |
| 379 | |
| 380 | let left_start = left_symbol |
| 381 | .address |
| 382 | .checked_sub(left_section.address) |
| 383 | .ok_or_else(|| anyhow!("Symbol address out of section bounds"))?; |
| 384 | let right_start = right_symbol |
| 385 | .address |
| 386 | .checked_sub(right_section.address) |
| 387 | .ok_or_else(|| anyhow!("Symbol address out of section bounds"))?; |
| 388 | let left_end = left_start + left_symbol.size; |
| 389 | if left_end > left_section.size { |
| 390 | return Err(anyhow!( |
| 391 | "Symbol {} size out of section bounds ({} > {})", |
| 392 | left_symbol.name, |
| 393 | left_end, |
| 394 | left_section.size |
| 395 | )); |
| 396 | } |
| 397 | let right_end = right_start + right_symbol.size; |
| 398 | if right_end > right_section.size { |
| 399 | return Err(anyhow!( |
| 400 | "Symbol {} size out of section bounds ({} > {})", |
| 401 | right_symbol.name, |
| 402 | right_end, |
| 403 | right_section.size |
| 404 | )); |
| 405 | } |
| 406 | let left_range = left_start as usize..left_end as usize; |
| 407 | let right_range = right_start as usize..right_end as usize; |
| 408 | let left_data = &left_section.data[left_range.clone()]; |
| 409 | let right_data = &right_section.data[right_range.clone()]; |
| 410 | |
| 411 | let (bytes_match_ratio, left_data_diff, right_data_diff) = |
| 412 | diff_data_range(left_data, right_data); |
| 413 | |
| 414 | let reloc_diffs = diff_data_relocs_for_range( |
| 415 | left_obj, |
| 416 | right_obj, |
| 417 | left_section_idx, |
| 418 | right_section_idx, |
| 419 | left_range, |
| 420 | right_range, |
no test coverage detected