]>
Commit | Line | Data |
---|---|---|
d02b48c6 RE |
1 | #!/usr/local/bin/perl |
2 | ||
3 | # we make up an array of | |
4 | # $file{function_name}=filename; | |
5 | # $unres{filename}="func1 func2 ...." | |
6 | $debug=1; | |
7 | #$nm_func="parse_linux"; | |
8 | $nm_func="parse_solaris"; | |
9 | ||
10 | foreach (@ARGV) | |
11 | { | |
12 | &$nm_func($_); | |
13 | } | |
14 | ||
15 | foreach $file (sort keys %unres) | |
16 | { | |
17 | @a=split(/\s+/,$unres{$file}); | |
18 | %ff=(); | |
19 | foreach $func (@a) | |
20 | { | |
21 | $f=$file{$func}; | |
22 | $ff{$f}=1 if $f ne ""; | |
23 | } | |
24 | ||
25 | foreach $a (keys %ff) | |
26 | { $we_need{$file}.="$a "; } | |
27 | } | |
28 | ||
29 | foreach $file (sort keys %we_need) | |
30 | { | |
31 | # print " $file $we_need{$file}\n"; | |
32 | foreach $bit (split(/\s+/,$we_need{$file})) | |
33 | { push(@final,&walk($bit)); } | |
34 | ||
35 | foreach (@final) { $fin{$_}=1; } | |
36 | @final=""; | |
37 | foreach (sort keys %fin) | |
38 | { push(@final,$_); } | |
39 | ||
40 | print "$file: @final\n"; | |
41 | } | |
42 | ||
43 | sub walk | |
44 | { | |
45 | local($f)=@_; | |
46 | local(@a,%seen,@ret,$r); | |
47 | ||
48 | @ret=""; | |
49 | $f =~ s/^\s+//; | |
50 | $f =~ s/\s+$//; | |
51 | return "" if ($f =~ "^\s*$"); | |
52 | ||
53 | return(split(/\s/,$done{$f})) if defined ($done{$f}); | |
54 | ||
55 | return if $in{$f} > 0; | |
56 | $in{$f}++; | |
57 | push(@ret,$f); | |
58 | foreach $r (split(/\s+/,$we_need{$f})) | |
59 | { | |
60 | push(@ret,&walk($r)); | |
61 | } | |
62 | $in{$f}--; | |
63 | $done{$f}=join(" ",@ret); | |
64 | return(@ret); | |
65 | } | |
66 | ||
67 | sub parse_linux | |
68 | { | |
69 | local($name)=@_; | |
70 | ||
71 | open(IN,"nm $name|") || die "unable to run 'nn $name':$!\n"; | |
72 | while (<IN>) | |
73 | { | |
74 | chop; | |
75 | next if /^\s*$/; | |
76 | if (/^[^[](.*):$/) | |
77 | { | |
78 | $file=$1; | |
79 | $file="$1.c" if /\[(.*).o\]/; | |
80 | print STDERR "$file\n"; | |
81 | $we_need{$file}=" "; | |
82 | next; | |
83 | } | |
84 | ||
85 | @a=split(/\s*\|\s*/); | |
86 | next unless $#a == 7; | |
87 | next unless $a[4] eq "GLOB"; | |
88 | if ($a[6] eq "UNDEF") | |
89 | { | |
90 | $unres{$file}.=$a[7]." "; | |
91 | } | |
92 | else | |
93 | { | |
94 | if ($file{$a[7]} ne "") | |
95 | { | |
96 | print STDERR "duplicate definition of $a[7],\n$file{$a[7]} and $file \n"; | |
97 | } | |
98 | else | |
99 | { | |
100 | $file{$a[7]}=$file; | |
101 | } | |
102 | } | |
103 | } | |
104 | close(IN); | |
105 | } | |
106 | ||
107 | sub parse_solaris | |
108 | { | |
109 | local($name)=@_; | |
110 | ||
111 | open(IN,"nm $name|") || die "unable to run 'nn $name':$!\n"; | |
112 | while (<IN>) | |
113 | { | |
114 | chop; | |
115 | next if /^\s*$/; | |
116 | if (/^(\S+):$/) | |
117 | { | |
118 | $file=$1; | |
119 | #$file="$1.c" if $file =~ /^(.*).o$/; | |
120 | print STDERR "$file\n"; | |
121 | $we_need{$file}=" "; | |
122 | next; | |
123 | } | |
124 | @a=split(/\s*\|\s*/); | |
125 | next unless $#a == 7; | |
126 | next unless $a[4] eq "GLOB"; | |
127 | if ($a[6] eq "UNDEF") | |
128 | { | |
129 | $unres{$file}.=$a[7]." "; | |
130 | print STDERR "$file needs $a[7]\n" if $debug; | |
131 | } | |
132 | else | |
133 | { | |
134 | if ($file{$a[7]} ne "") | |
135 | { | |
136 | print STDERR "duplicate definition of $a[7],\n$file{$a[7]} and $file \n"; | |
137 | } | |
138 | else | |
139 | { | |
140 | $file{$a[7]}=$file; | |
141 | print STDERR "$file has $a[7]\n" if $debug; | |
142 | } | |
143 | } | |
144 | } | |
145 | close(IN); | |
146 | } | |
147 |