123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #!/usr/local/bin/perl
- # we make up an array of
- # $file{function_name}=filename;
- # $unres{filename}="func1 func2 ...."
- $debug=1;
- #$nm_func="parse_linux";
- $nm_func="parse_solaris";
- foreach (@ARGV)
- {
- &$nm_func($_);
- }
- foreach $file (sort keys %unres)
- {
- @a=split(/\s+/,$unres{$file});
- %ff=();
- foreach $func (@a)
- {
- $f=$file{$func};
- $ff{$f}=1 if $f ne "";
- }
- foreach $a (keys %ff)
- { $we_need{$file}.="$a "; }
- }
- foreach $file (sort keys %we_need)
- {
- # print " $file $we_need{$file}\n";
- foreach $bit (split(/\s+/,$we_need{$file}))
- { push(@final,&walk($bit)); }
- foreach (@final) { $fin{$_}=1; }
- @final="";
- foreach (sort keys %fin)
- { push(@final,$_); }
- print "$file: @final\n";
- }
- sub walk
- {
- local($f)=@_;
- local(@a,%seen,@ret,$r);
- @ret="";
- $f =~ s/^\s+//;
- $f =~ s/\s+$//;
- return "" if ($f =~ "^\s*$");
- return(split(/\s/,$done{$f})) if defined ($done{$f});
- return if $in{$f} > 0;
- $in{$f}++;
- push(@ret,$f);
- foreach $r (split(/\s+/,$we_need{$f}))
- {
- push(@ret,&walk($r));
- }
- $in{$f}--;
- $done{$f}=join(" ",@ret);
- return(@ret);
- }
- sub parse_linux
- {
- local($name)=@_;
- open(IN,"nm $name|") || die "unable to run 'nn $name':$!\n";
- while (<IN>)
- {
- chop;
- next if /^\s*$/;
- if (/^[^[](.*):$/)
- {
- $file=$1;
- $file="$1.c" if /\[(.*).o\]/;
- print STDERR "$file\n";
- $we_need{$file}=" ";
- next;
- }
- @a=split(/\s*\|\s*/);
- next unless $#a == 7;
- next unless $a[4] eq "GLOB";
- if ($a[6] eq "UNDEF")
- {
- $unres{$file}.=$a[7]." ";
- }
- else
- {
- if ($file{$a[7]} ne "")
- {
- print STDERR "duplicate definition of $a[7],\n$file{$a[7]} and $file \n";
- }
- else
- {
- $file{$a[7]}=$file;
- }
- }
- }
- close(IN);
- }
- sub parse_solaris
- {
- local($name)=@_;
- open(IN,"nm $name|") || die "unable to run 'nn $name':$!\n";
- while (<IN>)
- {
- chop;
- next if /^\s*$/;
- if (/^(\S+):$/)
- {
- $file=$1;
- #$file="$1.c" if $file =~ /^(.*).o$/;
- print STDERR "$file\n";
- $we_need{$file}=" ";
- next;
- }
- @a=split(/\s*\|\s*/);
- next unless $#a == 7;
- next unless $a[4] eq "GLOB";
- if ($a[6] eq "UNDEF")
- {
- $unres{$file}.=$a[7]." ";
- print STDERR "$file needs $a[7]\n" if $debug;
- }
- else
- {
- if ($file{$a[7]} ne "")
- {
- print STDERR "duplicate definition of $a[7],\n$file{$a[7]} and $file \n";
- }
- else
- {
- $file{$a[7]}=$file;
- print STDERR "$file has $a[7]\n" if $debug;
- }
- }
- }
- close(IN);
- }
|