Skip to content

Commit fc54e93

Browse files
committed
API updates for ARM backend
1 parent c9b11db commit fc54e93

File tree

6 files changed

+30
-20
lines changed

6 files changed

+30
-20
lines changed

objdiff-core/src/arch/arm.rs

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
use std::{borrow::Cow, collections::HashMap};
1+
use std::{
2+
borrow::Cow,
3+
collections::{BTreeMap, HashMap},
4+
};
25

3-
use anyhow::{anyhow, bail, Result};
6+
use anyhow::{bail, Result};
47
use object::{
58
elf, File, Object, ObjectSection, ObjectSymbol, Relocation, RelocationFlags, SectionIndex,
69
SectionKind, Symbol,
@@ -14,7 +17,7 @@ use unarm::{
1417
use crate::{
1518
arch::{ObjArch, ProcessCodeResult},
1619
diff::DiffObjConfig,
17-
obj::{ObjInfo, ObjIns, ObjInsArg, ObjInsArgValue, ObjSection, SymbolRef},
20+
obj::{ObjIns, ObjInsArg, ObjInsArgValue, ObjReloc, ObjSection},
1821
};
1922

2023
pub struct ObjArchArm {
@@ -50,28 +53,25 @@ impl ObjArchArm {
5053
impl ObjArch for ObjArchArm {
5154
fn process_code(
5255
&self,
53-
obj: &ObjInfo,
54-
symbol_ref: SymbolRef,
56+
address: u64,
57+
code: &[u8],
58+
section_index: usize,
59+
relocations: &[ObjReloc],
60+
line_info: &BTreeMap<u64, u64>,
5561
config: &DiffObjConfig,
5662
) -> Result<ProcessCodeResult> {
57-
let (section, symbol) = obj.section_symbol(symbol_ref);
58-
let section = section.ok_or_else(|| anyhow!("Code symbol section not found"))?;
59-
let code = &section.data
60-
[symbol.section_address as usize..(symbol.section_address + symbol.size) as usize];
61-
62-
let start_addr = symbol.address as u32;
63-
let end_addr = start_addr + symbol.size as u32;
63+
let start_addr = address as u32;
64+
let end_addr = start_addr + code.len() as u32;
6465

6566
// Mapping symbols decide what kind of data comes after it. $a for ARM code, $t for Thumb code and $d for data.
66-
let fallback_mappings =
67-
[DisasmMode { address: symbol.address as u32, mapping: ParseMode::Arm }];
67+
let fallback_mappings = [DisasmMode { address: start_addr, mapping: ParseMode::Arm }];
6868
let mapping_symbols = self
6969
.disasm_modes
70-
.get(&SectionIndex(section.orig_index))
70+
.get(&SectionIndex(section_index))
7171
.map(|x| x.as_slice())
7272
.unwrap_or(&fallback_mappings);
7373
let first_mapping_idx =
74-
match mapping_symbols.binary_search_by_key(&(symbol.address as u32), |x| x.address) {
74+
match mapping_symbols.binary_search_by_key(&start_addr, |x| x.address) {
7575
Ok(idx) => idx,
7676
Err(idx) => idx - 1,
7777
};
@@ -96,10 +96,9 @@ impl ObjArch for ObjArchArm {
9696
}
9797
}
9898

99-
let line = section.line_info.range(..=address as u64).last().map(|(_, &b)| b);
99+
let line = line_info.range(..=address as u64).last().map(|(_, &b)| b);
100100

101-
let reloc =
102-
section.relocations.iter().find(|r| (r.address as u32 & !1) == address).cloned();
101+
let reloc = relocations.iter().find(|r| (r.address as u32 & !1) == address).cloned();
103102

104103
let mut reloc_arg = None;
105104
if let Some(reloc) = &reloc {

objdiff-core/src/arch/mips.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ impl ObjArch for ObjArchMips {
5959
&self,
6060
address: u64,
6161
code: &[u8],
62+
_section_index: usize,
6263
relocations: &[ObjReloc],
6364
line_info: &BTreeMap<u64, u64>,
6465
config: &DiffObjConfig,

objdiff-core/src/arch/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pub trait ObjArch: Send + Sync {
2222
&self,
2323
address: u64,
2424
code: &[u8],
25+
section_index: usize,
2526
relocations: &[ObjReloc],
2627
line_info: &BTreeMap<u64, u64>,
2728
config: &DiffObjConfig,

objdiff-core/src/arch/ppc.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ impl ObjArch for ObjArchPpc {
3333
&self,
3434
address: u64,
3535
code: &[u8],
36+
_section_index: usize,
3637
relocations: &[ObjReloc],
3738
line_info: &BTreeMap<u64, u64>,
3839
config: &DiffObjConfig,

objdiff-core/src/arch/x86.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ impl ObjArch for ObjArchX86 {
3030
&self,
3131
address: u64,
3232
code: &[u8],
33+
_section_index: usize,
3334
relocations: &[ObjReloc],
3435
line_info: &BTreeMap<u64, u64>,
3536
config: &DiffObjConfig,

objdiff-core/src/diff/code.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,14 @@ pub fn process_code_symbol(
2525
let section = section.ok_or_else(|| anyhow!("Code symbol section not found"))?;
2626
let code = &section.data
2727
[symbol.section_address as usize..(symbol.section_address + symbol.size) as usize];
28-
obj.arch.process_code(symbol.address, code, &section.relocations, &section.line_info, config)
28+
obj.arch.process_code(
29+
symbol.address,
30+
code,
31+
section.orig_index,
32+
&section.relocations,
33+
&section.line_info,
34+
config,
35+
)
2936
}
3037

3138
pub fn no_diff_code(out: &ProcessCodeResult, symbol_ref: SymbolRef) -> Result<ObjSymbolDiff> {

0 commit comments

Comments
 (0)