From 42eed424e1ea6469ce73cb2fdddb0d31bebb686a Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Fri, 16 Aug 2013 23:29:47 -0700 Subject: [PATCH] disas-objdump: Pass --adjust-vma to objdump This gives the dumped blob its correct address during disassembly, which makes pc-relative insns much easier to interpret. Signed-off-by: Richard Henderson Signed-off-by: Edgar E. Iglesias --- scripts/disas-objdump.pl | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/scripts/disas-objdump.pl b/scripts/disas-objdump.pl index c66a629763..8f7e8182a1 100755 --- a/scripts/disas-objdump.pl +++ b/scripts/disas-objdump.pl @@ -29,7 +29,7 @@ sub mkobjcommand ($$) { my ($cmd, $mach) = @_; return 0 if !$mach; $cmd = $aobjdump if !$cmd; - return "$cmd -m $mach --disassemble-all -b binary $outname"; + return "$cmd -m $mach --disassemble-all -b binary"; } $objdump[1] = mkobjcommand($hobjdump, $hmachine); @@ -38,6 +38,7 @@ $objdump[2] = mkobjcommand($tobjdump, $tmachine); # Zero-initialize current dumping state. my $mem = ""; my $inobjd = 0; +my $vma = 0; sub objcommand { my $ret = $objdump[$inobjd]; @@ -50,7 +51,7 @@ sub objcommand { } while (<>) { - # Collect the data from the relevant OBJD-* lines. + # Collect the data from the relevant OBJD-* lines ... if (/^OBJD-H: /) { die "Internal error" if $inobjd == 2; $mem = $mem . pack("H*", substr($_, 8, -1)); @@ -68,8 +69,12 @@ while (<>) { truncate $outh, 0; syswrite $outh, $mem; + my $cmd = objcommand(); + $cmd = $cmd . " --adjust-vma=" . $vma if $vma; + $cmd = $cmd . " " . $outname; + # Pipe from objdump... - open IN, "-|", objcommand(); + open IN, "-|", $cmd; # ... copying all but the first 7 lines of boilerplate to our stdout. my $i = 0; @@ -81,6 +86,13 @@ while (<>) { $mem = ""; $inobjd = 0; + $vma = 0; + } + # The line before "OBJD-*" will be of the form "0x+: +\n". + # Extract the value for passing to --adjust-vma. + elsif (/^(0x[0-9a-fA-F]+):\s*$/) { + $vma = $1; + print; } else { print; }