#!/usr/bin/perl -w my $mapfile = shift || '/LinuxPPC/usr/src/linux/System.map'; print STDERR "Reading symbols from $mapfile\n"; # # Read symbol table # open (MAP, $mapfile) or die "Can't open $mapfile: $!\n"; my $cnt = 0; while () { chomp; my ($a,$t,$n) = split; $a = eval ('0x' . $a); if ($t =~ /^t$/i) { $addr[$cnt] = $a; $name[$cnt] = $n; ++$cnt; } } close MAP; my ($i, $n, $last); #for ($i=0; $i<$cnt; ++$i) { # printf "0x%08x %s\n", $addr[$i], $name[$i]; #} # # Now get backtrace info from stdin # while (<>) { chomp; my @a = split; my $aa; for ($i=0; $i<=$#a; ++$i) { $aa = eval ('0x' . $a[$i]); $last = -1; for ($n=0; $n<$cnt; ++$n) { if ($addr[$n] > $aa) { last; } $last = $n; } if ($last) { my $offset = $aa - $addr[$last]; printf "0x%08x -- 0x%08x + 0x%04x %s\n", $aa, $addr[$last], $offset, $name[$last]; } else { printf "0x%08x -- unknown address\n", $i, $aa; } } }