The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/local/bin/perl

%def   = ();
%need  = ();
%here  = ();

sub read_need
{
 my $need = shift;
 open(NEED,"<$need") || die "Cannot open $need:$!";
 while (<NEED>)
  {
   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 (<NM>)
  {
   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{$_});
 }