2003-01-28 02:31:00 +03:00
|
|
|
#!/usr/bin/perl -w
|
|
|
|
#
|
2012-05-21 15:12:37 +04:00
|
|
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
2003-01-28 02:31:00 +03:00
|
|
|
|
|
|
|
use strict;
|
|
|
|
|
|
|
|
#
|
|
|
|
# A wrapper for nm that produces output listing symbol size.
|
|
|
|
#
|
|
|
|
my($prev_addr) = 0;
|
|
|
|
my($prev_module) = "";
|
|
|
|
my($prev_kind) = "";
|
|
|
|
my($prev_symbol) = "";
|
|
|
|
|
|
|
|
open(NM_OUTPUT, "nm -fnol $ARGV[0] | c++filt |") or die "nm failed to run on $ARGV[0]\n";
|
|
|
|
while (<NM_OUTPUT>)
|
|
|
|
{
|
|
|
|
my($line) = $_;
|
|
|
|
chomp($line);
|
|
|
|
|
2007-07-21 07:23:35 +04:00
|
|
|
if ($line =~ /^([^:]+):\s*([0-9a-f]{8}) (\w) (.+)$/)
|
2003-01-28 02:31:00 +03:00
|
|
|
{
|
|
|
|
my($module) = $1;
|
|
|
|
my($addr) = $2;
|
|
|
|
my($kind) = $3;
|
|
|
|
my($symbol) = $4;
|
2008-08-11 18:16:59 +04:00
|
|
|
|
|
|
|
#Skip absolute addresses, there should be only a few
|
2008-08-12 12:31:03 +04:00
|
|
|
if ('a' eq lc $kind) {
|
2008-08-11 18:16:59 +04:00
|
|
|
if ('trampoline_size' ne $symbol) {
|
|
|
|
warn "Encountered unknown absolutely addressed symbol '$symbol' in $module";
|
|
|
|
}
|
|
|
|
next;
|
|
|
|
}
|
|
|
|
|
2003-01-28 02:31:00 +03:00
|
|
|
# we expect the input to have been piped through c++filt to
|
|
|
|
# demangle symbols. For some reason, it doesn't always demangle
|
|
|
|
# all of them, so push still-mangled symbols back through c++filt again.
|
|
|
|
if ($symbol =~ /^(_[_Z].+)/)
|
|
|
|
{
|
|
|
|
# warn "Trying again to unmangle $1\n";
|
|
|
|
$symbol = `c++filt '$1'`;
|
|
|
|
chomp($symbol);
|
|
|
|
# warn "Unmangling again to $symbol\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
my($prev_size) = hex($addr) - hex($prev_addr);
|
|
|
|
# print "Outputting line $line\n";
|
|
|
|
|
|
|
|
# always print one behind, because only now do we know its size
|
|
|
|
if ($prev_module ne "") {
|
|
|
|
printf "%s:%08x %s %s\n", $prev_module, $prev_size, $prev_kind, $prev_symbol;
|
|
|
|
}
|
|
|
|
|
|
|
|
$prev_addr = $addr;
|
|
|
|
$prev_module = $module;
|
|
|
|
$prev_kind = $kind;
|
|
|
|
$prev_symbol = $symbol;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
# warn " Discaring line $line\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# we don't know how big the last symbol is, so always show 4.
|
|
|
|
if ($prev_module ne "") {
|
|
|
|
printf "%s:%08x %s %s\n", $prev_module, 4, $prev_kind, $prev_symbol;
|
|
|
|
}
|