-
Notifications
You must be signed in to change notification settings - Fork 17
/
depmod.pl
executable file
·109 lines (82 loc) · 1.91 KB
/
depmod.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/perl -w
use strict;
my $verbose=0;
my %definers;
my %reqsyms;
my %reqmods;
my %printed;
my @arglist = <*.so>;
#push @arglist, "../newserv";
my @realarglist;
open DEPENDS,">modules.dep";
open GRAPH,">modgraph.dot";
if (@ARGV) {
if ($ARGV[0] eq "--verbose" or $ARGV[0] eq "-v") {
$verbose=1;
}
}
for (@arglist) {
my $modname=$_;
open NM,"nm $modname |";
$modname =~ s/.so$//;
push @realarglist, $modname;
$reqsyms{$modname} = [];
while (<NM>) {
chomp;
next unless (/([URTB]) (\S+)/);
my ($type,$sym) = ($1, $2);
next if ($sym eq "_init");
next if ($sym eq "_fini");
next if ($sym eq "_version");
next if ($sym eq "__bss_start");
next if ($sym eq "_end");
if ($type eq "U") {
push @{$reqsyms{$modname}}, $sym;
} else {
if (defined $definers{$sym}) {
print "WARNING: Multiple modules export $sym, at least $modname and $definers{$sym}\n";
} else {
$definers{$sym}=$modname;
}
}
}
close NM;
}
print GRAPH "digraph g { \n";
for (@realarglist) {
my $modname=$_;
$reqmods{$modname} = {};
for (@{$reqsyms{$modname}}) {
my $provider = $definers{$_};
if (defined $provider) {
${reqmods{$modname}}{$provider}=1;
if ($verbose) {
print "Module $modname importing $_ from $provider\n";
}
}
}
}
for (@realarglist) {
printdep($_);
}
print GRAPH "}\n";
close GRAPH;
close DEPENDS;
sub printdep {
my ($modname) = @_;
if (!(defined $printed{$modname})) {
$printed{$modname}=1;
for (keys %{$reqmods{$modname}}) {
printdep($_);
}
print DEPENDS "$modname";
for (keys %{$reqmods{$modname}}) {
if (defined ${$reqmods{$_}}{$modname}) {
print "ERROR: circular dependency between $modname and $_\n";
}
print DEPENDS " $_";
print GRAPH "\t\"$modname\" -> \"$_\";\n";
}
print DEPENDS "\n";
}
}