diff options
Diffstat (limited to 'scripts/disas-objdump.pl')
-rwxr-xr-x | scripts/disas-objdump.pl | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/scripts/disas-objdump.pl b/scripts/disas-objdump.pl index c66a629..8f7e818 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<hex>+: +\n". + # Extract the value for passing to --adjust-vma. + elsif (/^(0x[0-9a-fA-F]+):\s*$/) { + $vma = $1; + print; } else { print; } |