Skip to content

Commit 87f4c5d

Browse files
committed
Fetch symbol data dynamically from resolved.section
1 parent 04534f5 commit 87f4c5d

File tree

9 files changed

+92
-118
lines changed

9 files changed

+92
-118
lines changed

objdiff-core/src/arch/arm.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,6 @@ impl Arch for ArchArm {
330330
&self,
331331
resolved: ResolvedInstructionRef,
332332
diff_config: &DiffObjConfig,
333-
_code: Option<&[u8]>,
334333
cb: &mut dyn FnMut(InstructionPart) -> Result<()>,
335334
) -> Result<()> {
336335
let (ins, parsed_ins) = self.parse_ins_ref(resolved.ins_ref, resolved.code, diff_config)?;

objdiff-core/src/arch/arm64.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ impl Arch for ArchArm64 {
8080
&self,
8181
resolved: ResolvedInstructionRef,
8282
_diff_config: &DiffObjConfig,
83-
_code: Option<&[u8]>,
8483
cb: &mut dyn FnMut(InstructionPart) -> Result<()>,
8584
) -> Result<()> {
8685
let mut reader = U8Reader::new(resolved.code);

objdiff-core/src/arch/mips.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ impl Arch for ArchMips {
219219
&self,
220220
resolved: ResolvedInstructionRef,
221221
diff_config: &DiffObjConfig,
222-
_code: Option<&[u8]>,
223222
cb: &mut dyn FnMut(InstructionPart) -> Result<()>,
224223
) -> Result<()> {
225224
let instruction = self.parse_ins_ref(resolved.ins_ref, resolved.code, diff_config)?;

objdiff-core/src/arch/mod.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ pub trait Arch: Send + Sync + Debug {
208208
) -> Result<ParsedInstruction> {
209209
let mut mnemonic = None;
210210
let mut args = Vec::with_capacity(8);
211-
self.display_instruction(resolved, diff_config, None, &mut |part| {
211+
self.display_instruction(resolved, diff_config, &mut |part| {
212212
match part {
213213
InstructionPart::Opcode(m, _) => mnemonic = Some(Cow::Owned(m.into_owned())),
214214
InstructionPart::Arg(arg) => args.push(arg.into_static()),
@@ -236,7 +236,6 @@ pub trait Arch: Send + Sync + Debug {
236236
&self,
237237
resolved: ResolvedInstructionRef,
238238
diff_config: &DiffObjConfig,
239-
code: Option<&[u8]>,
240239
cb: &mut dyn FnMut(InstructionPart) -> Result<()>,
241240
) -> Result<()>;
242241

@@ -345,7 +344,6 @@ impl Arch for ArchDummy {
345344
&self,
346345
_resolved: ResolvedInstructionRef,
347346
_diff_config: &DiffObjConfig,
348-
_code: Option<&[u8]>,
349347
_cb: &mut dyn FnMut(InstructionPart) -> Result<()>,
350348
) -> Result<()> {
351349
Ok(())

objdiff-core/src/arch/ppc.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ impl Arch for ArchPpc {
110110
&self,
111111
resolved: ResolvedInstructionRef,
112112
_diff_config: &DiffObjConfig,
113-
_code: Option<&[u8]>,
114113
cb: &mut dyn FnMut(InstructionPart) -> Result<()>,
115114
) -> Result<()> {
116115
let ins = self.parse_ins_ref(resolved)?.simplified();

objdiff-core/src/arch/superh/mod.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ impl Arch for ArchSuperH {
6969
&self,
7070
resolved: ResolvedInstructionRef,
7171
_diff_config: &DiffObjConfig,
72-
_code: Option<&[u8]>,
7372
cb: &mut dyn FnMut(InstructionPart) -> Result<()>,
7473
) -> Result<()> {
7574
let opcode = u16::from_be_bytes(resolved.code.try_into().unwrap());
@@ -78,13 +77,13 @@ impl Arch for ArchSuperH {
7877

7978
sh2_disasm(0, opcode, true, &mut parts, &resolved, &mut branch_dest);
8079

81-
if let Some(code) = _code {
80+
if let Some(symbol_data) = resolved.section.symbol_data(resolved.symbol) {
8281
// scan for data
8382
// map of instruction offsets to data target offsets
8483
let mut data_offsets: HashMap<u64, DataInfo> = HashMap::<u64, DataInfo>::new();
8584

8685
let mut pos: u64 = 0;
87-
for chunk in code.chunks_exact(2) {
86+
for chunk in symbol_data.chunks_exact(2) {
8887
let opcode = u16::from_be_bytes(chunk.try_into().unwrap());
8988
// mov.w
9089
if (opcode & 0xf000) == 0x9000 {
@@ -105,19 +104,19 @@ impl Arch for ArchSuperH {
105104

106105
// add the data info
107106
if let Some(value) = data_offsets.get(&pos) {
108-
if value.size == 2 && value.address as usize + 1 < code.len() {
107+
if value.size == 2 && value.address as usize + 1 < symbol_data.len() {
109108
let data = u16::from_be_bytes(
110-
code[value.address as usize..value.address as usize + 2]
109+
symbol_data[value.address as usize..value.address as usize + 2]
111110
.try_into()
112111
.unwrap(),
113112
);
114113
parts.push(InstructionPart::basic(" /* "));
115114
parts.push(InstructionPart::basic("0x"));
116115
parts.push(InstructionPart::basic(format!("{:04X}", data)));
117116
parts.push(InstructionPart::basic(" */"));
118-
} else if value.size == 4 && value.address as usize + 3 < code.len() {
117+
} else if value.size == 4 && value.address as usize + 3 < symbol_data.len() {
119118
let data = u32::from_be_bytes(
120-
code[value.address as usize..value.address as usize + 4]
119+
symbol_data[value.address as usize..value.address as usize + 4]
121120
.try_into()
122121
.unwrap(),
123122
);
@@ -213,7 +212,7 @@ mod test {
213212
use std::fmt::{self, Display};
214213

215214
use super::*;
216-
use crate::obj::{InstructionArg, Symbol};
215+
use crate::obj::{InstructionArg, Section, SectionData, Symbol};
217216

218217
impl Display for InstructionPart<'_> {
219218
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
@@ -261,7 +260,6 @@ mod test {
261260
..Default::default()
262261
},
263262
&DiffObjConfig::default(),
264-
None,
265263
&mut |part| {
266264
parts.push(part.into_static());
267265
Ok(())
@@ -340,7 +338,6 @@ mod test {
340338
..Default::default()
341339
},
342340
&DiffObjConfig::default(),
343-
None,
344341
&mut |part| {
345342
parts.push(part.into_static());
346343
Ok(())
@@ -424,7 +421,6 @@ mod test {
424421
..Default::default()
425422
},
426423
&DiffObjConfig::default(),
427-
None,
428424
&mut |part| {
429425
parts.push(part.into_static());
430426
Ok(())
@@ -462,7 +458,6 @@ mod test {
462458
..Default::default()
463459
},
464460
&DiffObjConfig::default(),
465-
None,
466461
&mut |part| {
467462
parts.push(part.into_static());
468463
Ok(())
@@ -512,7 +507,6 @@ mod test {
512507
..Default::default()
513508
},
514509
&DiffObjConfig::default(),
515-
None,
516510
&mut |part| {
517511
parts.push(part.into_static());
518512
Ok(())
@@ -549,7 +543,6 @@ mod test {
549543
..Default::default()
550544
},
551545
&DiffObjConfig::default(),
552-
None,
553546
&mut |part| {
554547
parts.push(part.into_static());
555548
Ok(())
@@ -589,7 +582,6 @@ mod test {
589582
..Default::default()
590583
},
591584
&DiffObjConfig::default(),
592-
None,
593585
&mut |part| {
594586
parts.push(part.into_static());
595587
Ok(())
@@ -629,7 +621,6 @@ mod test {
629621
..Default::default()
630622
},
631623
&DiffObjConfig::default(),
632-
None,
633624
&mut |part| {
634625
parts.push(part.into_static());
635626
Ok(())
@@ -662,7 +653,6 @@ mod test {
662653
..Default::default()
663654
},
664655
&DiffObjConfig::default(),
665-
None,
666656
&mut |part| {
667657
parts.push(part.into_static());
668658
Ok(())
@@ -692,7 +682,6 @@ mod test {
692682
..Default::default()
693683
},
694684
&DiffObjConfig::default(),
695-
None,
696685
&mut |part| {
697686
parts.push(part.into_static());
698687
Ok(())
@@ -716,7 +705,6 @@ mod test {
716705
code.extend_from_slice(&0x00B0_u16.to_be_bytes());
717706

718707
for &(opcode, addr, expected_str) in ops {
719-
let code_slice = &code;
720708
let mut parts = Vec::new();
721709

722710
arch.display_instruction(
@@ -725,12 +713,18 @@ mod test {
725713
code: &opcode.to_be_bytes(),
726714
symbol: &Symbol {
727715
address: 0x0606F378, // func base address
716+
size: code.len() as u64,
717+
..Default::default()
718+
},
719+
section: &Section {
720+
address: 0x0606F378,
721+
size: code.len() as u64,
722+
data: SectionData(code.clone()),
728723
..Default::default()
729724
},
730725
..Default::default()
731726
},
732727
&DiffObjConfig::default(),
733-
Some(code_slice),
734728
&mut |part| {
735729
parts.push(part.into_static());
736730
Ok(())
@@ -765,12 +759,18 @@ mod test {
765759
code: &opcode.to_be_bytes(),
766760
symbol: &Symbol {
767761
address: 0x0606F378, // func base address
762+
size: code.len() as u64,
763+
..Default::default()
764+
},
765+
section: &Section {
766+
address: 0x0606F378,
767+
size: code.len() as u64,
768+
data: SectionData(code.clone()),
768769
..Default::default()
769770
},
770771
..Default::default()
771772
},
772773
&DiffObjConfig::default(),
773-
Some(code_slice),
774774
&mut |part| {
775775
parts.push(part.into_static());
776776
Ok(())

objdiff-core/src/arch/x86.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,6 @@ impl Arch for ArchX86 {
150150
&self,
151151
resolved: ResolvedInstructionRef,
152152
diff_config: &DiffObjConfig,
153-
_code: Option<&[u8]>,
154153
cb: &mut dyn FnMut(InstructionPart) -> Result<()>,
155154
) -> Result<()> {
156155
if resolved.ins_ref.opcode == DATA_OPCODE {
@@ -483,7 +482,6 @@ mod test {
483482
..Default::default()
484483
},
485484
&DiffObjConfig::default(),
486-
None,
487485
&mut |part| {
488486
parts.push(part.into_static());
489487
Ok(())
@@ -529,7 +527,6 @@ mod test {
529527
..Default::default()
530528
},
531529
&DiffObjConfig::default(),
532-
None,
533530
&mut |part| {
534531
parts.push(part.into_static());
535532
Ok(())
@@ -575,7 +572,6 @@ mod test {
575572
..Default::default()
576573
},
577574
&DiffObjConfig::default(),
578-
None,
579575
&mut |part| {
580576
parts.push(part.into_static());
581577
Ok(())
@@ -619,7 +615,6 @@ mod test {
619615
..Default::default()
620616
},
621617
&DiffObjConfig::default(),
622-
None,
623618
&mut |part| {
624619
parts.push(part.into_static());
625620
Ok(())
@@ -651,7 +646,6 @@ mod test {
651646
..Default::default()
652647
},
653648
&DiffObjConfig::default(),
654-
None,
655649
&mut |part| {
656650
parts.push(part.into_static());
657651
Ok(())
@@ -691,7 +685,6 @@ mod test {
691685
..Default::default()
692686
},
693687
&DiffObjConfig::default(),
694-
None,
695688
&mut |part| {
696689
parts.push(part.into_static());
697690
Ok(())
@@ -731,7 +724,6 @@ mod test {
731724
..Default::default()
732725
},
733726
&DiffObjConfig::default(),
734-
None,
735727
&mut |part| {
736728
parts.push(part.into_static());
737729
Ok(())

0 commit comments

Comments
 (0)