(obj: &Object, symbol_index: usize)
| 310 | } |
| 311 | |
| 312 | pub fn no_diff_data_symbol(obj: &Object, symbol_index: usize) -> Result<SymbolDiff> { |
| 313 | let symbol = &obj.symbols[symbol_index]; |
| 314 | let section_idx = symbol.section.ok_or_else(|| anyhow!("Data symbol section not found"))?; |
| 315 | let section = &obj.sections[section_idx]; |
| 316 | |
| 317 | let start = symbol |
| 318 | .address |
| 319 | .checked_sub(section.address) |
| 320 | .ok_or_else(|| anyhow!("Symbol address out of section bounds"))?; |
| 321 | let end = start + symbol.size; |
| 322 | if end > section.size { |
| 323 | return Err(anyhow!( |
| 324 | "Symbol {} size out of section bounds ({} > {})", |
| 325 | symbol.name, |
| 326 | end, |
| 327 | section.size |
| 328 | )); |
| 329 | } |
| 330 | let range = start as usize..end as usize; |
| 331 | let data = §ion.data[range.clone()]; |
| 332 | |
| 333 | let data_diff = vec![DataDiff { |
| 334 | data: data.to_vec(), |
| 335 | kind: DataDiffKind::None, |
| 336 | size: symbol.size as usize, |
| 337 | }]; |
| 338 | |
| 339 | let mut reloc_diffs = Vec::new(); |
| 340 | for reloc in section.relocations.iter() { |
| 341 | if !range.contains(&(reloc.address as usize)) { |
| 342 | continue; |
| 343 | } |
| 344 | let reloc_len = obj.arch.data_reloc_size(reloc.flags); |
| 345 | let range = reloc.address..reloc.address + reloc_len as u64; |
| 346 | reloc_diffs.push(DataRelocationDiff { |
| 347 | reloc: reloc.clone(), |
| 348 | kind: DataDiffKind::None, |
| 349 | range, |
| 350 | }); |
| 351 | } |
| 352 | |
| 353 | let data_rows = build_data_diff_rows(&data_diff, &reloc_diffs, symbol.address); |
| 354 | Ok(SymbolDiff { |
| 355 | target_symbol: None, |
| 356 | match_percent: None, |
| 357 | diff_score: None, |
| 358 | data_rows, |
| 359 | ..Default::default() |
| 360 | }) |
| 361 | } |
| 362 | |
| 363 | pub fn diff_data_symbol( |
| 364 | left_obj: &Object, |
no test coverage detected