Skip to content

Commit 07ef93f

Browse files
committed
Ignore extern symbols with symbol name lookups
When searching for a symbol by name, only look at symbols that are defined within the object, ignoring extern symbols (symbols without section). Fixes #180 Fixes #181
1 parent 8e8ab6b commit 07ef93f

File tree

4 files changed

+15
-26
lines changed

4 files changed

+15
-26
lines changed

objdiff-cli/src/views/function_diff.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -450,11 +450,11 @@ impl UiView for FunctionDiffUi {
450450

451451
fn reload(&mut self, state: &AppState) -> Result<()> {
452452
let left_sym =
453-
state.left_obj.as_ref().and_then(|(o, _)| find_function(o, &self.symbol_name));
453+
state.left_obj.as_ref().and_then(|(o, _)| o.symbol_by_name(&self.symbol_name));
454454
let right_sym =
455-
state.right_obj.as_ref().and_then(|(o, _)| find_function(o, &self.symbol_name));
455+
state.right_obj.as_ref().and_then(|(o, _)| o.symbol_by_name(&self.symbol_name));
456456
let prev_sym =
457-
state.prev_obj.as_ref().and_then(|(o, _)| find_function(o, &self.symbol_name));
457+
state.prev_obj.as_ref().and_then(|(o, _)| o.symbol_by_name(&self.symbol_name));
458458
self.num_rows = match (
459459
get_symbol(state.left_obj.as_ref(), left_sym),
460460
get_symbol(state.right_obj.as_ref(), right_sym),
@@ -650,12 +650,3 @@ fn get_symbol(
650650
let sym = sym?;
651651
Some((obj, sym, &diff.symbols[sym]))
652652
}
653-
654-
fn find_function(obj: &Object, name: &str) -> Option<usize> {
655-
for (symbol_idx, symbol) in obj.symbols.iter().enumerate() {
656-
if symbol.name == name {
657-
return Some(symbol_idx);
658-
}
659-
}
660-
None
661-
}

objdiff-core/src/diff/mod.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ fn generate_mapping_symbols(
391391
MappingSymbol::Left(name) => (left_obj, name, right_obj),
392392
MappingSymbol::Right(name) => (right_obj, name, left_obj),
393393
};
394-
let Some(base_symbol_ref) = symbol_ref_by_name(base_obj, base_name) else {
394+
let Some(base_symbol_ref) = base_obj.symbol_by_name(base_name) else {
395395
return Ok(());
396396
};
397397
let base_section_kind = symbol_section_kind(base_obj, &base_obj.symbols[base_symbol_ref]);
@@ -457,10 +457,6 @@ pub struct MappingConfig {
457457
pub selecting_right: Option<String>,
458458
}
459459

460-
fn symbol_ref_by_name(obj: &Object, name: &str) -> Option<usize> {
461-
obj.symbols.iter().position(|s| s.name == name)
462-
}
463-
464460
fn apply_symbol_mappings(
465461
left: &Object,
466462
right: &Object,
@@ -472,25 +468,25 @@ fn apply_symbol_mappings(
472468
// If we're selecting a symbol to use as a comparison, mark it as used
473469
// This ensures that we don't match it to another symbol at any point
474470
if let Some(left_name) = &mapping_config.selecting_left {
475-
if let Some(left_symbol) = symbol_ref_by_name(left, left_name) {
471+
if let Some(left_symbol) = left.symbol_by_name(left_name) {
476472
left_used.insert(left_symbol);
477473
}
478474
}
479475
if let Some(right_name) = &mapping_config.selecting_right {
480-
if let Some(right_symbol) = symbol_ref_by_name(right, right_name) {
476+
if let Some(right_symbol) = right.symbol_by_name(right_name) {
481477
right_used.insert(right_symbol);
482478
}
483479
}
484480

485481
// Apply manual symbol mappings
486482
for (left_name, right_name) in &mapping_config.mappings {
487-
let Some(left_symbol_index) = symbol_ref_by_name(left, left_name) else {
483+
let Some(left_symbol_index) = left.symbol_by_name(left_name) else {
488484
continue;
489485
};
490486
if left_used.contains(&left_symbol_index) {
491487
continue;
492488
}
493-
let Some(right_symbol_index) = symbol_ref_by_name(right, right_name) else {
489+
let Some(right_symbol_index) = right.symbol_by_name(right_name) else {
494490
continue;
495491
};
496492
if right_used.contains(&right_symbol_index) {

objdiff-core/src/obj/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,10 @@ impl Object {
308308
let offset = symbol.address.checked_sub(section.address)?;
309309
section.data.get(offset as usize..offset as usize + symbol.size as usize)
310310
}
311+
312+
pub fn symbol_by_name(&self, name: &str) -> Option<usize> {
313+
self.symbols.iter().position(|symbol| symbol.section.is_some() && symbol.name == name)
314+
}
311315
}
312316

313317
#[derive(Debug, Clone, Eq, PartialEq, Hash)]

objdiff-gui/src/views/diff.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ impl<'a> DiffColumnContext<'a> {
4949
let selected_symbol = match view {
5050
View::SymbolDiff => None,
5151
View::FunctionDiff | View::ExtabDiff => match (obj, selected_symbol) {
52-
(Some(obj), Some(s)) => find_symbol(&obj.0, s).map(SelectedSymbol::Symbol),
52+
(Some(obj), Some(s)) => {
53+
obj.0.symbol_by_name(&s.symbol_name).map(SelectedSymbol::Symbol)
54+
}
5355
_ => None,
5456
},
5557
View::DataDiff => match (obj, selected_symbol) {
@@ -779,10 +781,6 @@ fn missing_obj_ui(ui: &mut Ui, appearance: &Appearance) {
779781
});
780782
}
781783

782-
fn find_symbol(obj: &Object, selected_symbol: &SymbolRefByName) -> Option<usize> {
783-
obj.symbols.iter().position(|symbol| symbol.name == selected_symbol.symbol_name)
784-
}
785-
786784
fn find_section(obj: &Object, section_name: &str) -> Option<usize> {
787785
obj.sections.iter().position(|section| section.name == section_name)
788786
}

0 commit comments

Comments
 (0)