#! /usr/bin/perl -w use strict; # Usage: $0 foo.a bar.a ... # or $0 foo.o bar.o ... my %sym2file = (); foreach my $def_filename (@ARGV) { open(DEF, "nm --defined-only --extern-only '$def_filename' |") or die "Can't open nm pipe for $def_filename"; while() { my @F = split; my $symtype = $F[1]; my $sym = $F[2]; # We currently ignore weak symbols. I hope this doesn't bite us... if ($sym && $symtype !~ /\A[VW]\z/) { if (defined($sym2file{$sym})) { die "duplicate symbol $sym in $sym2file{$sym} and $def_filename"; } $sym2file{$sym} = $def_filename; } } } foreach my $undef_filename (@ARGV) { open(UNDEF, "nm --undefined-only --extern-only '$undef_filename' |") or die "Can't open nm pipe for $undef_filename"; my %deps = (); while() { my @F = split; #print "<", join(">, <", @F), ">\n"; my $sym = $F[1]; if ($sym) { my $def_filename = $sym2file{$sym}; if (defined($def_filename) && $def_filename && $def_filename ne $undef_filename) { $deps{$def_filename} = 0; } } } foreach my $def_filename (keys %deps) { #print "$undef_filename $def_filename\n"; print "$def_filename $undef_filename\n"; } } #for i in `find -name '*.a'`;do nm --defined-only --extern-only "$i"|perl -nae 'print " \"$F[2]\", '"'$i'"',\n" if $F[2];';done