Skip to content

Commit 041bf28

Browse files
committed
PPC: Allow copying strings pointed to by relocs in the data view
1 parent f765681 commit 041bf28

3 files changed

Lines changed: 45 additions & 27 deletions

File tree

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ use crate::{
2020
},
2121
obj::{
2222
FlowAnalysisResult, InstructionArg, InstructionRef, Object, ParsedInstruction, Relocation,
23-
RelocationFlags, ResolvedInstructionRef, ResolvedSymbol, Section, Symbol, SymbolFlagSet,
24-
SymbolKind,
23+
RelocationFlags, ResolvedInstructionRef, ResolvedRelocation, ResolvedSymbol, Section,
24+
Symbol, SymbolFlagSet, SymbolKind,
2525
},
2626
util::ReallySigned,
2727
};
@@ -464,12 +464,17 @@ pub trait Arch: Any + Debug + Send + Sync {
464464

465465
fn guess_data_type(
466466
&self,
467-
_resolved: ResolvedInstructionRef,
467+
_ins: Option<ResolvedInstructionRef>,
468+
_reloc: Option<ResolvedRelocation>,
468469
_bytes: &[u8],
469470
) -> Option<DataType> {
470471
None
471472
}
472473

474+
fn guess_ins_data_type(&self, ins: ResolvedInstructionRef, bytes: &[u8]) -> Option<DataType> {
475+
self.guess_data_type(Some(ins), ins.relocation, bytes)
476+
}
477+
473478
fn symbol_hover(&self, _obj: &Object, _symbol_index: usize) -> Vec<HoverItem> { Vec::new() }
474479

475480
fn symbol_context(&self, _obj: &Object, _symbol_index: usize) -> Vec<ContextItem> { Vec::new() }

‎objdiff-core/src/arch/ppc/mod.rs‎

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -357,8 +357,13 @@ impl Arch for ArchPpc {
357357
}
358358
}
359359

360-
fn guess_data_type(&self, resolved: ResolvedInstructionRef, bytes: &[u8]) -> Option<DataType> {
361-
if resolved.relocation.is_some_and(|r| {
360+
fn guess_data_type(
361+
&self,
362+
ins: Option<ResolvedInstructionRef>,
363+
reloc: Option<ResolvedRelocation>,
364+
bytes: &[u8],
365+
) -> Option<DataType> {
366+
if reloc.is_some_and(|r| {
362367
r.symbol.name.starts_with("@stringBase")
363368
|| r.symbol.name.starts_with("@wstringBase")
364369
|| r.symbol.name.starts_with("$SG")
@@ -367,10 +372,12 @@ impl Arch for ArchPpc {
367372
// Compiler-generated symbol name for a string or a pool of strings.
368373
return Some(DataType::String);
369374
}
370-
let opcode = powerpc::Opcode::from(resolved.ins_ref.opcode);
371-
if let Some(ty) = flow_analysis::guess_data_type_from_load_store_inst_op(opcode) {
372-
// Numeric type.
373-
return Some(ty);
375+
if let Some(ins) = ins {
376+
let opcode = powerpc::Opcode::from(ins.ins_ref.opcode);
377+
if let Some(ty) = flow_analysis::guess_data_type_from_load_store_inst_op(opcode) {
378+
// Numeric type.
379+
return Some(ty);
380+
}
374381
}
375382
if bytes.len() >= 2 && bytes.iter().position(|&c| c == b'\0') == Some(bytes.len() - 1) {
376383
// It may be an unpooled string if the symbol contains exactly one null byte at the end of the symbol.

‎objdiff-core/src/diff/display.rs‎

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -499,18 +499,16 @@ pub fn relocation_context(
499499
) -> Vec<ContextItem> {
500500
let mut out = Vec::new();
501501
out.append(&mut symbol_context(obj, reloc.relocation.target_symbol));
502-
if let Some(ins) = ins {
503-
let mut literals = display_ins_data_literals(obj, ins);
504-
literals.retain(|lit_info| !lit_info.hidden(diff_config));
505-
if !literals.is_empty() {
506-
out.push(ContextItem::Separator);
507-
for lit_info in literals {
508-
out.push(ContextItem::Copy {
509-
value: lit_info.literal,
510-
label: lit_info.label_override,
511-
copy_string: lit_info.copy_string,
512-
});
513-
}
502+
let mut literals = display_data_literals(obj, ins, Some(reloc));
503+
literals.retain(|lit_info| !lit_info.hidden(diff_config));
504+
if !literals.is_empty() {
505+
out.push(ContextItem::Separator);
506+
for lit_info in literals {
507+
out.push(ContextItem::Copy {
508+
value: lit_info.literal,
509+
label: lit_info.label_override,
510+
copy_string: lit_info.copy_string,
511+
});
514512
}
515513
}
516514
out
@@ -695,7 +693,7 @@ pub fn instruction_hover(
695693
out.push(HoverItem::Separator);
696694
out.append(&mut relocation_hover(obj, reloc, None));
697695
let bytes = obj.symbol_data(reloc.relocation.target_symbol).unwrap_or(&[]);
698-
if let Some(ty) = obj.arch.guess_data_type(resolved, bytes) {
696+
if let Some(ty) = obj.arch.guess_ins_data_type(resolved, bytes) {
699697
let mut literals = display_ins_data_literals(obj, resolved);
700698
literals.retain(|lit_info| !lit_info.hidden(Some(diff_config)));
701699
if !literals.is_empty() {
@@ -882,16 +880,17 @@ pub fn display_ins_data_labels(obj: &Object, resolved: ResolvedInstructionRef) -
882880
};
883881
let bytes = &data[reloc.relocation.addend as usize..];
884882
obj.arch
885-
.guess_data_type(resolved, bytes)
883+
.guess_ins_data_type(resolved, bytes)
886884
.map(|ty| ty.display_labels(obj.endianness, bytes))
887885
.unwrap_or_default()
888886
}
889887

890-
pub fn display_ins_data_literals(
888+
pub fn display_data_literals(
891889
obj: &Object,
892-
resolved: ResolvedInstructionRef,
890+
resolved: Option<ResolvedInstructionRef>,
891+
reloc: Option<ResolvedRelocation>,
893892
) -> Vec<LiteralInfo> {
894-
let Some(reloc) = resolved.relocation else {
893+
let Some(reloc) = reloc else {
895894
return Vec::new();
896895
};
897896
if reloc.relocation.addend < 0 || reloc.relocation.addend as u64 >= reloc.symbol.size {
@@ -902,7 +901,14 @@ pub fn display_ins_data_literals(
902901
};
903902
let bytes = &data[reloc.relocation.addend as usize..];
904903
obj.arch
905-
.guess_data_type(resolved, bytes)
904+
.guess_data_type(resolved, Some(reloc), bytes)
906905
.map(|ty| ty.display_literals(obj.endianness, bytes))
907906
.unwrap_or_default()
908907
}
908+
909+
pub fn display_ins_data_literals(
910+
obj: &Object,
911+
resolved: ResolvedInstructionRef,
912+
) -> Vec<LiteralInfo> {
913+
display_data_literals(obj, Some(resolved), resolved.relocation)
914+
}

0 commit comments

Comments
 (0)