objdiff-cli diff: Support "Relax relocation diffs" (#50)

Bound to the `-x` flag or the `x` key.
This commit is contained in:
Robin Avery 2024-03-02 20:47:18 -05:00 committed by GitHub
parent 023dd7a55b
commit ed5d092b11
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 12 additions and 1 deletions

View File

@ -43,6 +43,9 @@ pub struct Args {
#[argp(option, short = 'u')] #[argp(option, short = 'u')]
/// Unit name within project /// Unit name within project
unit: Option<String>, unit: Option<String>,
#[argp(switch, short = 'x')]
/// Relax relocation diffs
relax_reloc_diffs: bool,
#[argp(positional)] #[argp(positional)]
/// Function symbol to diff /// Function symbol to diff
symbol: String, symbol: String,
@ -144,6 +147,7 @@ pub fn run(args: Args) -> Result<()> {
.context("Failed to parse time format")?; .context("Failed to parse time format")?;
let mut state = Box::new(FunctionDiffUi { let mut state = Box::new(FunctionDiffUi {
redraw: true, redraw: true,
relax_reloc_diffs: args.relax_reloc_diffs,
click_xy: None, click_xy: None,
left_highlight: HighlightKind::None, left_highlight: HighlightKind::None,
right_highlight: HighlightKind::None, right_highlight: HighlightKind::None,
@ -216,6 +220,7 @@ fn find_function(obj: &ObjInfo, name: &str) -> Option<ObjSymbol> {
#[allow(dead_code)] #[allow(dead_code)]
struct FunctionDiffUi { struct FunctionDiffUi {
redraw: bool, redraw: bool,
relax_reloc_diffs: bool,
click_xy: Option<(u16, u16)>, click_xy: Option<(u16, u16)>,
left_highlight: HighlightKind, left_highlight: HighlightKind,
right_highlight: HighlightKind, right_highlight: HighlightKind,
@ -472,6 +477,12 @@ impl FunctionDiffUi {
self.scroll_x = self.scroll_x.saturating_sub(1); self.scroll_x = self.scroll_x.saturating_sub(1);
self.redraw = true; self.redraw = true;
} }
// Toggle relax relocation diffs
KeyCode::Char('x') => {
self.relax_reloc_diffs = !self.relax_reloc_diffs;
self.redraw = true;
return FunctionDiffResult::Reload;
}
_ => {} _ => {}
} }
} }
@ -630,7 +641,7 @@ impl FunctionDiffUi {
.as_deref() .as_deref()
.map(|p| obj::elf::read(p).with_context(|| format!("Loading {}", p.display()))) .map(|p| obj::elf::read(p).with_context(|| format!("Loading {}", p.display())))
.transpose()?; .transpose()?;
let config = diff::DiffObjConfig::default(); let config = diff::DiffObjConfig { relax_reloc_diffs: self.relax_reloc_diffs };
diff::diff_objs(&config, target.as_mut(), base.as_mut())?; diff::diff_objs(&config, target.as_mut(), base.as_mut())?;
let left_sym = target.as_ref().and_then(|o| find_function(o, &self.symbol_name)); let left_sym = target.as_ref().and_then(|o| find_function(o, &self.symbol_name));