add jim's map2dot tool
This commit is contained in:
parent
58561f5b71
commit
ff146c7e9f
1 changed files with 31 additions and 0 deletions
31
tools/map2dot.pl
Executable file
31
tools/map2dot.pl
Executable file
|
@ -0,0 +1,31 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
# Try:
|
||||
# gcc -static -o test test.c -Wl,--print-map | perl parse-map.pl | unflatten -l 3 | dot -Tpng > map.png
|
||||
#
|
||||
# This won't show all edges! An archive member is only listed the first
|
||||
# time it needs to get included. But this shows at least one reason why each
|
||||
# archive member appears in the final object.
|
||||
|
||||
my $flag = 0;
|
||||
my $line = "";
|
||||
print "digraph map {\n";
|
||||
print "rankdir = LR;";
|
||||
while(<>)
|
||||
{
|
||||
$flag++ if /^Archive member included because of file \(symbol\)$/;
|
||||
$flag++ if /^$/;
|
||||
next unless $flag == 2;
|
||||
|
||||
chomp ($line .= $_);
|
||||
if ($line =~ /^(\S+)\s+(\S+)\s+\(([^)]+)\)$/s) {
|
||||
$line = "";
|
||||
my $archive_member = $1;
|
||||
my $because_file = $2;
|
||||
my $because_symbol = $3;
|
||||
$archive_member =~ s|.*/([^/]+)|$1|;
|
||||
$because_file =~ s|.*/([^/]+)|$1|;
|
||||
print "\"$because_file\" -> \"$archive_member\";\n";
|
||||
}
|
||||
}
|
||||
print "}\n";
|
Loading…
Reference in a new issue