#!/usr/local/bin/perl %def = (); %need = (); %here = (); sub read_need { my $need = shift; open(NEED,"<$need") || die "Cannot open $need:$!"; while () { next if (/^ld:/); next if (/^\s+\./); if (/^([A-Za-z][A-Za-z0-9_]*).*\.o\s*$/) { $need{$1}++; } elsif (/^\s+_([_A-Za-z][A-Za-z0-9_]*)\s*$/) { my $sym = $1; $need{$sym}++ unless($sym =~ /^_/); } else { warn "No match:$_"; } } close(NEED); } sub read_nm { my $src = shift; open(NM,"nm -p $src|") || die "Cannot open pipe:$!"; while () { if (/^\S+\s+([A-Z])\s+(\S+)\s*$/) { my $kind = $1; my $sym = $2; $def{$sym} = $src if ($kind ne "U"); $here{$sym}++ if ($kind eq "U"); } } close(NM); } &read_need(shift); foreach (@ARGV) { &read_nm($_); } #foreach (sort keys %def) # { # print "$_ $def{$_} not needed\n" unless (defined($need{$_}) || defined($here{$_})); # } foreach (sort keys %need) { print "$_ IS needed\n" unless (defined $def{$_}); }