@@ -1,5 +1,7 @@
#!/usr/bin/perl
+use strict;
+
use File::Basename;
use Math::BigInt;
use Getopt::Long;
@@ -17,7 +19,6 @@ use Getopt::Long;
my $cross_compile = "";
-my $vmlinux_name = "";
my $modulefile = "";
# Get options
@@ -26,12 +27,13 @@ Getopt::Long::GetOptions(
'module|m=s' => \$modulefile,
'help|h' => \&usage,
) || usage ();
+
my $vmlinux_name = $ARGV[0];
if (!defined($vmlinux_name)) {
my $kerver = `uname -r`;
chomp($kerver);
$vmlinux_name = "/lib/modules/$kerver/build/vmlinux";
- print "No vmlinux specified, assuming $vmlinux_name\n";
+ warn "No vmlinux specified, assuming $vmlinux_name\n";
}
my $filename = $vmlinux_name;
@@ -89,9 +91,9 @@ sub parse_x86_regs
sub reg_name
{
my ($reg) = @_;
- $reg =~ s/r(.)x/e\1x/;
- $reg =~ s/r(.)i/e\1i/;
- $reg =~ s/r(.)p/e\1p/;
+ $reg =~ s/r(.)x/e$1x/;
+ $reg =~ s/r(.)i/e$1i/;
+ $reg =~ s/r(.)p/e$1p/;
return $reg;
}
@@ -104,17 +106,15 @@ sub process_x86_regs
}
# find the arguments to the instruction
- if ($line =~ /([0-9a-zA-Z\,\%\(\)\-\+]+)$/) {
- $lastword = $1;
- } else {
- return "";
- }
+ return "" unless ($line =~ /([0-9a-zA-Z\,\%\(\)\-\+]+)$/);
+
+ my $lastword = $1;
# we need to find the registers that get clobbered,
# since their value is no longer relevant for previous
# instructions in the stream.
- $clobber = $lastword;
+ my $clobber = $lastword;
# first, remove all memory operands, they're read only
$clobber =~ s/\([a-z0-9\%\,]+\)//g;
# then, remove everything before the comma, thats the read part
@@ -126,7 +126,7 @@ sub process_x86_regs
$clobber = "";
}
- foreach $reg (keys(%regs)) {
+ foreach my $reg (keys(%regs)) {
my $clobberprime = reg_name($clobber);
my $lastwordprime = reg_name($lastword);
my $val = $regs{$reg};
@@ -202,14 +202,16 @@ if ($module ne "") {
exit;
}
# ok so we found the module, now we need to calculate the vma offset
- open(FILE, $cross_compile."objdump -dS $filename |") || die "Cannot start objdump";
- while (<FILE>) {
- if ($_ =~ /^([0-9a-f]+) \<$function\>\:/) {
- my $fu = $1;
- $vmaoffset = Math::BigInt->from_hex("0x$target") - Math::BigInt->from_hex("0x$fu") - Math::BigInt->from_hex("0x$func_offset");
- }
+ open(my $obj, '-|', "objdump -dS $filename")
+ or die "Cannot start objdump: $!";
+ while (<$obj>) {
+ next unless ($_ =~ /^([0-9a-f]+) \<$function\>\:/);
+ my $fu = $1;
+ $vmaoffset = Math::BigInt->from_hex("0x$target")
+ - Math::BigInt->from_hex("0x$fu")
+ - Math::BigInt->from_hex("0x$func_offset");
}
- close(FILE);
+ close($obj);
}
my $counter = 0;
@@ -234,10 +236,11 @@ sub InRange {
# first, parse the input into the lines array, but to keep size down,
# we only do this for 4Kb around the sweet spot
+open(my $objdump, '-|',
+ "objdump -dS --adjust-vma=$vmaoffset --start-address=$decodestart --stop-address=$decodestop $filename")
+ or die "Cannot start objdump: $!";
-open(FILE, $cross_compile."objdump -dS --adjust-vma=$vmaoffset --start-address=$decodestart --stop-address=$decodestop $filename |") || die "Cannot start objdump";
-
-while (<FILE>) {
+while (<$objdump>) {
my $line = $_;
chomp($line);
if ($state == 0) {
@@ -263,7 +266,7 @@ while (<FILE>) {
}
}
-close(FILE);
+close($objdump);
if ($counter == 0) {
print "No matching code found \n";