32 lines
855 B
Perl
32 lines
855 B
Perl
|
#!/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";
|