Skip to content

Commit de74dfd

Browse files
committed
Add dummy symbols to empty sections
Allows diffing sections without symbols Resolves #87
1 parent 177bd5e commit de74dfd

File tree

3 files changed

+55
-26
lines changed

3 files changed

+55
-26
lines changed

objdiff-core/src/diff/mod.rs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,20 @@ fn matching_symbols(
612612
Ok(matches)
613613
}
614614

615+
fn unmatched_symbols<'section, 'used>(
616+
section: &'section ObjSection,
617+
section_idx: usize,
618+
used: Option<&'used HashSet<SymbolRef>>,
619+
) -> impl Iterator<Item = (usize, &'section ObjSymbol)> + 'used
620+
where
621+
'section: 'used,
622+
{
623+
section.symbols.iter().enumerate().filter(move |&(symbol_idx, _)| {
624+
// Skip symbols that have already been matched
625+
!used.map(|u| u.contains(&SymbolRef { section_idx, symbol_idx })).unwrap_or(false)
626+
})
627+
}
628+
615629
fn find_symbol(
616630
obj: Option<&ObjInfo>,
617631
in_symbol: &ObjSymbol,
@@ -624,8 +638,8 @@ fn find_symbol(
624638
if section.kind != in_section.kind {
625639
continue;
626640
}
627-
if let Some(symbol_idx) =
628-
section.symbols.iter().position(|symbol| symbol.name == in_symbol.name)
641+
if let Some((symbol_idx, _)) = unmatched_symbols(section, section_idx, used)
642+
.find(|(_, symbol)| symbol.name == in_symbol.name)
629643
{
630644
return Some(SymbolRef { section_idx, symbol_idx });
631645
}
@@ -638,9 +652,11 @@ fn find_symbol(
638652
if let Some((section_idx, section)) =
639653
obj.sections.iter().enumerate().find(|(_, s)| s.name == in_section.name)
640654
{
641-
if let Some(symbol_idx) = section.symbols.iter().position(|symbol| {
642-
symbol.address == in_symbol.address && symbol.name.starts_with('@')
643-
}) {
655+
if let Some((symbol_idx, _)) =
656+
unmatched_symbols(section, section_idx, used).find(|(_, symbol)| {
657+
symbol.address == in_symbol.address && symbol.name.starts_with('@')
658+
})
659+
{
644660
return Some(SymbolRef { section_idx, symbol_idx });
645661
}
646662
}
@@ -655,13 +671,7 @@ fn find_symbol(
655671
continue;
656672
}
657673
if let Some((symbol_idx, _)) =
658-
section.symbols.iter().enumerate().find(|&(symbol_idx, symbol)| {
659-
if used
660-
.map(|u| u.contains(&SymbolRef { section_idx, symbol_idx }))
661-
.unwrap_or(false)
662-
{
663-
return false;
664-
}
674+
unmatched_symbols(section, section_idx, used).find(|&(_, symbol)| {
665675
if let Some((p, s)) = symbol.name.split_once('$') {
666676
prefix == p && s.chars().all(char::is_numeric)
667677
} else {

objdiff-core/src/obj/read.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,23 @@ fn symbols_by_section(
160160
}
161161
}
162162
}
163+
if result.is_empty() {
164+
// Dummy symbol for empty sections
165+
result.push(ObjSymbol {
166+
name: format!("[{}]", section.name),
167+
demangled_name: None,
168+
has_extab: false,
169+
extab_name: None,
170+
extabindex_name: None,
171+
address: 0,
172+
section_address: 0,
173+
size: section.size,
174+
size_known: true,
175+
flags: Default::default(),
176+
addend: 0,
177+
virtual_address: None,
178+
});
179+
}
163180
Ok(result)
164181
}
165182

objdiff-gui/src/views/symbol_diff.rs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -233,21 +233,23 @@ fn symbol_ui(
233233
{
234234
selected = symbol_diff.symbol_ref == sym_ref;
235235
}
236-
write_text("[", appearance.text_color, &mut job, appearance.code_font.clone());
237-
if symbol.flags.0.contains(ObjSymbolFlags::Common) {
238-
write_text("c", appearance.replace_color, &mut job, appearance.code_font.clone());
239-
} else if symbol.flags.0.contains(ObjSymbolFlags::Global) {
240-
write_text("g", appearance.insert_color, &mut job, appearance.code_font.clone());
241-
} else if symbol.flags.0.contains(ObjSymbolFlags::Local) {
242-
write_text("l", appearance.text_color, &mut job, appearance.code_font.clone());
243-
}
244-
if symbol.flags.0.contains(ObjSymbolFlags::Weak) {
245-
write_text("w", appearance.text_color, &mut job, appearance.code_font.clone());
246-
}
247-
if symbol.flags.0.contains(ObjSymbolFlags::Hidden) {
248-
write_text("h", appearance.deemphasized_text_color, &mut job, appearance.code_font.clone());
236+
if !symbol.flags.0.is_empty() {
237+
write_text("[", appearance.text_color, &mut job, appearance.code_font.clone());
238+
if symbol.flags.0.contains(ObjSymbolFlags::Common) {
239+
write_text("c", appearance.replace_color, &mut job, appearance.code_font.clone());
240+
} else if symbol.flags.0.contains(ObjSymbolFlags::Global) {
241+
write_text("g", appearance.insert_color, &mut job, appearance.code_font.clone());
242+
} else if symbol.flags.0.contains(ObjSymbolFlags::Local) {
243+
write_text("l", appearance.text_color, &mut job, appearance.code_font.clone());
244+
}
245+
if symbol.flags.0.contains(ObjSymbolFlags::Weak) {
246+
write_text("w", appearance.text_color, &mut job, appearance.code_font.clone());
247+
}
248+
if symbol.flags.0.contains(ObjSymbolFlags::Hidden) {
249+
write_text("h", appearance.deemphasized_text_color, &mut job, appearance.code_font.clone());
250+
}
251+
write_text("] ", appearance.text_color, &mut job, appearance.code_font.clone());
249252
}
250-
write_text("] ", appearance.text_color, &mut job, appearance.code_font.clone());
251253
if let Some(match_percent) = symbol_diff.match_percent {
252254
write_text("(", appearance.text_color, &mut job, appearance.code_font.clone());
253255
write_text(

0 commit comments

Comments
 (0)