OpenSSL 1.0.1j
[tomato/davidwu.git] / release / src / btools / libfoo.pl
blob7e92f014338244a1c895aec9323687d663585fbf
1 #!/usr/bin/perl
3 # libfoo.pl
4 # Copyright (C) 2006-2008 Jonathan Zarate
6 # - strip un-needed objects
7 # - create xref of symbols used
10 $root = $ENV{"TARGETDIR"};
11 $uclibc = $ENV{"TOOLCHAIN"};
12 $router = $ENV{"SRCBASE"} . "/router";
14 sub error
16 print STDERR "\n*** ERROR: " . (shift) . "\n\n";
17 exit 1;
20 sub basename
22 my $fn = shift;
23 if ($fn =~ /([^\/]+)$/) {
24 return $1;
26 return $fn;
29 sub load
31 my $fname = shift;
33 if ((-l $fname) ||
34 ($fname =~ /\/lib\/modules\/\d+\.\d+\.\d+/) ||
35 ($fname =~ /\.(asp|gif|png|svg|js|jsx|css|txt|pat|sh)$/)) {
36 return;
39 if (-d $fname) {
40 my $d;
41 if (opendir($d, $fname)) {
42 foreach (readdir($d)) {
43 if ($_ !~ /^\./) {
44 load($fname . "/" . $_);
47 closedir($d);
49 return;
53 my $f;
54 my $base;
55 my $ok;
56 my $s;
58 $base = basename($fname);
59 print LOG "\n\nreadelf $base:\n";
61 open($f, "mipsel-linux-readelf -WhsdD ${fname} 2>&1 |") || error("readelf - $!\n");
63 while (<$f>) {
64 print LOG;
66 if (/\s+Type:\s+(\w+)/) {
67 $elf_type{$base} = $1;
68 $ok = 1;
69 last;
73 if (!$ok) {
74 close($f);
75 return;
78 print "$elf_type{$base} $base", " " x 30, "\r";
80 push(@elfs, $base);
82 while (<$f>) {
83 print LOG;
85 if (/\(NEEDED\)\s+Shared library: \[(.+)\]/) {
86 push(@{$elf_lib{$base}}, $1);
88 elsif (/Symbol table for image:/) {
89 last;
93 while (<$f>) {
94 print LOG;
96 if (/\s+(WEAK|GLOBAL)\s+(?:DEFAULT|VISIBLE)\s+(\w+)\s+(\w+)/) {
97 $s = $3;
98 if ($2 eq 'UND') {
99 if ($1 eq 'GLOBAL') {
100 $elf_ext{$base}{$s} = 1;
102 else {
103 print LOG "*** not GLOBAL\n";
106 elsif ($2 eq 'ABS') {
108 elsif ($2 =~ /^\d+$/) {
109 $elf_exp{$base}{$s} = 1;
111 else {
112 print LOG "*** unknown type\n";
115 elsif (!/Num Buc:/) {
116 print LOG "*** strange line\n";
120 close($f);
123 sub fixDynDep
125 my ($user, $dep) = @_;
127 if (!defined $elf_dyn{$user}{$dep}) {
128 push(@{$elf_lib{$user}}, $dep);
129 $elf_dyn{$user}{$dep} = 1;
131 print LOG "FixDynDep: $user = $dep\n";
135 sub fixDyn
137 my $s;
139 foreach (@elfs) {
140 if (/^libipt_.+\.so$/) {
141 fixDynDep("iptables", $_);
143 elsif (/^libip6t_.+\.so$/) {
144 fixDynDep("ip6tables", $_);
146 elsif (/^CP\d+\.so$/) {
147 fixDynDep("smbd", $_);
151 fixDynDep("l2tpd", "cmd.so");
152 fixDynDep("l2tpd", "sync-pppd.so");
153 fixDynDep("pppd", "pppol2tp.so");
154 fixDynDep("pppd", "pptp.so");
155 fixDynDep("pppd", "rp-pppoe.so");
157 fixDynDep("libcrypto.so.1.0.0", "libssl.so.1.0.0");
159 #shibby
160 fixDynDep("transmission-daemon", "libevent-2.0.so.5");
161 fixDynDep("transmission-daemon", "libcurl.so.4.3.0");
162 # fixDynDep("transmission-daemon", "libiconv.so.2.4.0");
163 fixDynDep("transmission-remote", "libevent-2.0.so.5");
164 fixDynDep("transmission-remote", "libcurl.so.4.3.0");
165 # fixDynDep("transmission-remote", "libiconv.so.2.4.0");
166 fixDynDep("radvd", "libdaemon.so.0.5.0");
167 fixDynDep("miniupnpd", "libnfnetlink.so.0.2.0");
168 fixDynDep("dnscrypt-proxy", "libsodium.so.13.0.2");
170 #minidlna module, bwq518
171 fixDynDep("minidlna", "libz.so.1");
172 fixDynDep("minidlna", "libstdc.so.6");
173 fixDynDep("minidlna", "libiconv.so.2.4.0");
174 fixDynDep("minidlna", "libssl.so.1.0.0");
175 fixDynDep("minidlna", "libjpeg.so");
176 fixDynDep("minidlna", "libogg.so.0");
177 fixDynDep("minidlna", "libvorbis.so.0");
178 fixDynDep("minidlna", "libid3tag.so.0");
179 fixDynDep("minidlna", "libexif.so.12");
180 fixDynDep("minidlna", "libFLAC.so.8");
181 fixDynDep("libjepg.so", "libc.so.0");
182 fixDynDep("libavcodec.so.52", "libpthread.so.0");
184 #ipset modules
185 fixDynDep("libipset_iphash.so", "ipset");
186 fixDynDep("libipset_iptree.so", "ipset");
187 fixDynDep("libipset_ipmap.so", "ipset");
188 fixDynDep("libipset_ipporthash.so", "ipset");
189 fixDynDep("libipset_ipportiphash.so", "ipset");
190 fixDynDep("libipset_ipportnethash.so", "ipset");
191 fixDynDep("libipset_iptreemap.so", "ipset");
192 fixDynDep("libipset_macipmap.so", "ipset");
193 fixDynDep("libipset_nethash.so", "ipset");
194 fixDynDep("libipset_portmap.so", "ipset");
195 fixDynDep("libipset_setlist.so", "ipset");
197 fixDynDep("tomatodata.cgi", "libc.so.0");
198 fixDynDep("tomatoups.cgi", "libc.so.0");
199 fixDynDep("apcupsd", "libc.so.0");
200 fixDynDep("apcupsd", "libgcc_s.so.1");
201 fixDynDep("apcaccess", "libc.so.0");
202 fixDynDep("smtp", "libc.so.0");
204 # fixDynDep("libbcm.so", "libshared.so");
205 # fixDynDep("libbcm.so", "libc.so.0");
207 fixDynDep("nginx", "libpcre.so.1.2.3");
208 fixDynDep("nginx", "libpcreposix.so.0.0.2");
209 fixDynDep("php-cgi", "libxml2.so.2.9.1");
210 fixDynDep("php-cgi", "libpng12.so.0.51.0");
211 fixDynDep("php-cgi", "libpng.so.3.51.0");
212 fixDynDep("php-cgi", "libiconv.so.2.5.1");
213 fixDynDep("php-cgi", "libsqlite3.so.0.8.6");
214 fixDynDep("php-cli", "libxml2.so.2.9.1");
215 fixDynDep("php-cli", "libpng12.so.0.51.0");
216 fixDynDep("php-cli", "libpng.so.3.51.0");
217 fixDynDep("php-cli", "libiconv.so.2.5.1");
218 fixDynDep("php-cli", "libsqlite3.so.0.8.6");
220 #!!TB - Updated Broadcom WL driver
221 fixDynDep("libbcmcrypto.so", "libc.so.0");
222 fixDynDep("nas", "libbcmcrypto.so");
223 fixDynDep("wl", "libbcmcrypto.so");
224 fixDynDep("nas", "libc.so.0");
225 fixDynDep("wl", "libc.so.0");
227 #Roadkill for NocatSplash
228 fixDynDep("splashd","libglib-1.2.so.0.0.10");
231 sub usersOf
233 my $name = shift;
234 my $sym = shift;
235 my @x;
236 my $e;
237 my $l;
239 @x = ();
240 foreach $e (@elfs) {
241 foreach $l (@{$elf_lib{$e}}) {
242 if ($l eq $name) {
243 if ((!defined $sym) || (defined $elf_ext{$e}{$sym})) {
244 push(@x, $e);
246 last;
250 return @x;
253 sub resolve
255 my $name = shift;
256 my $sym = shift;
257 my $l;
259 foreach $l (@{$elf_lib{$name}}) {
260 # print "\n$l $sym ", $elf_exp{$l}{$sym}, "\n";
261 return $l if (defined $elf_exp{$l}{$sym});
263 return "*** unresolved ***";
266 sub fillGaps
268 my $name;
269 my $sym;
270 my @users;
271 my $u;
272 my $t;
273 my $found;
275 # print "Resolving implicit links...\n";
277 foreach $name (@elfs) {
278 foreach $sym (keys %{$elf_ext{$name}}) {
279 $found = 0;
281 if ($sym eq '__uClibc_start_main') {
282 $sym = '__uClibc_main';
285 # __gnu_local_gp is defined specially by the linker on MIPS
286 if ($sym eq '__gnu_local_gp') {
287 $found = 1;
289 elsif (resolve($name, $sym) eq "*** unresolved ***") {
290 @users = usersOf($name);
291 foreach $u (@users) {
292 # if exported by $u
293 if (defined $elf_exp{$u}{$sym}) {
294 fixDynDep($name, $u);
295 $found = 1;
297 # if exported by shared libs of $u
298 if (($t = resolve($u, $sym)) ne "*** unresolved ***") {
299 fixDynDep($name, $t);
300 $found = 1;
304 if ($found == 0) {
305 print "Unable to resolve $sym used by $name\n", @users;
306 exit 1;
313 sub tab
315 my $current = shift;
316 my $target = shift;
317 my $s = "";
318 my $n;
320 while (1) {
321 $n = $current + (4 - ($current % 4));
322 last if ($n > $target);
323 $s = $s . "\t";
324 $current = $n;
326 while ($current < $target) {
327 $s = $s . " ";
328 $current++;
330 return $s;
333 sub genXref
335 my $f;
336 my $fname;
337 my $s;
338 my @u;
340 # print "Generating Xref Report...\n";
342 open($f, ">libfoo_xref.txt");
343 foreach $fname (sort keys %elf_type) {
344 print $f "$fname:\n";
346 if (scalar(@{$elf_lib{$fname}}) > 0) {
347 print $f "Dependency:\n";
348 foreach $s (sort @{$elf_lib{$fname}}) {
349 print $f "\t$s", defined $elf_dyn{$fname}{$s} ? " (dyn)\n" : "\n";
353 if (scalar(keys %{$elf_exp{$fname}}) > 0) {
354 print $f "Export:\n";
355 foreach $s (sort keys %{$elf_exp{$fname}}) {
356 @u = usersOf($fname, $s);
357 if (scalar(@u) > 0) {
358 print $f "\t$s", tab(length($s) + 4, 40), " > ", join(",", @u), "\n";
360 else {
361 print $f "\t$s\n";
366 if (scalar(keys %{$elf_ext{$fname}}) > 0) {
367 print $f "External:\n";
368 foreach $s (sort keys %{$elf_ext{$fname}}) {
369 print $f "\t$s", tab(length($s) + 4, 40), " < ", resolve($fname, $s), "\n";
373 print $f "\n";
375 close($f);
379 sub genSO
381 my ($so, $arc, $strip, $opt) = @_;
382 my $name = basename($so);
383 my $sym;
384 my $fn;
385 my $inuse;
386 my @used;
387 my @unused;
388 my $cmd;
389 my $before, $after;
391 if (!-f $so) {
392 print "$name: not found, skipping...\n";
393 return 0;
396 #!!TB
397 if (!-f $arc) {
398 print "$arc: not found, skipping...\n";
399 return 0;
402 foreach $sym (sort keys %{$elf_exp{$name}}) {
403 if ((scalar(usersOf($name, $sym)) > 0) || (${strip} eq "no")) {
404 push(@used, $sym);
406 else {
407 push(@unused, $sym);
411 # print "\n$name: Attempting to link ", scalar(@used), " and remove ", scalar(@unused), " objects...\n";
413 print LOG "\n\n${base}\n";
415 # $cmd = "mipsel-uclibc-ld -shared -s -z combreloc --warn-common --fatal-warnings ${opt} -soname ${name} -o ${so}";
416 $cmd = "mipsel-uclibc-gcc -shared -nostdlib -Wl,-s,-z,combreloc -Wl,--warn-common -Wl,--fatal-warnings -Wl,--gc-sections ${opt} -Wl,-soname=${name} -o ${so}";
417 foreach (@{$elf_lib{$name}}) {
418 if ((!$elf_dyn{$name}{$_}) && (/^lib(.+)\.so/)) {
419 $cmd .= " -l$1";
421 else {
422 # print LOG "Not marking for linkage: $_\n";
425 # print "$cmd -u... ${arc}\n";
426 if (scalar(@used) == 0) {
427 print "$name: WARNING: Library is not used by anything, deleting...\n";
428 unlink $so;
429 # <>;
430 return 0;
432 $cmd .= " -u " . join(" -u ", @used) . " ". $arc;
434 print LOG "Command: $cmd\n";
435 print LOG "Used: ", join(",", @used), "\n";
436 print LOG "Unused: ", join(",", @unused), "\n";
438 $before = -s $so;
440 system($cmd);
441 if ($? != 0) {
442 error("ld returned $?");
445 $after = -s $so;
447 print "$name: Attempted to remove ", scalar(@unused), "/", scalar(@unused) + scalar(@used), " symbols. ";
448 printf "%.2fK - %.2fK = %.2fK\n", $before / 1024, $after / 1024, ($before - $after) / 1024;
450 # print "\n$name: Attempting to link ", scalar(@used), " and remove ", scalar(@unused), " objects...\n";
451 # printf "Before: %.2fK / After: %.2fK / Removed: %.2fK\n\n", $before / 1024, $after / 1024, ($before - $after) / 1024;
453 return ($before > $after)
461 # print "\nlibfoo.pl - fooify shared libraries\n";
462 # print "Copyright (C) 2006-2007 Jonathan Zarate\n\n";
464 if ((!-d $root) || (!-d $uclibc) || (!-d $router)) {
465 print "Missing or invalid environment variables\n";
466 exit(1);
469 open(LOG, ">libfoo.debug");
470 #open(LOG, ">/dev/null");
472 print "Loading...\r";
473 load($root);
474 print "Finished loading files.", " " x 30, "\r";
476 fixDyn();
477 fillGaps();
479 genXref();
481 $stripshared = "yes";
482 if ($ARGV[0] eq "--noopt") {
483 $stripshared = "no";
486 genSO("${root}/lib/libc.so.0", "${uclibc}/lib/libc.a", "", "-Wl,-init=__uClibc_init ${uclibc}/lib/optinfo/interp.os");
487 genSO("${root}/lib/libresolv.so.0", "${uclibc}/lib/libresolv.a", "${stripshared}");
488 genSO("${root}/lib/libcrypt.so.0", "${uclibc}/lib/libcrypt.a", "${stripshared}");
489 genSO("${root}/lib/libm.so.0", "${uclibc}/lib/libm.a");
490 genSO("${root}/lib/libpthread.so.0", "${uclibc}/lib/libpthread.a", "${stripshared}", "-u pthread_mutexattr_init -Wl,-init=__pthread_initialize_minimal_internal");
491 genSO("${root}/lib/libutil.so.0", "${uclibc}/lib/libutil.a", "${stripshared}");
492 # genSO("${root}/lib/libdl.so.0", "${uclibc}/lib/libdl.a", "${stripshared}");
493 # genSO("${root}/lib/libnsl.so.0", "${uclibc}/lib/libnsl.a", "${stripshared}");
495 genSO("${root}/usr/lib/libcrypto.so.1.0.0", "${router}/openssl/libcrypto.a");
496 genSO("${root}/usr/lib/libssl.so.1.0.0", "${router}/openssl/libssl.a", "${stripshared}", "-L${router}/openssl");
498 genSO("${root}/usr/lib/libzebra.so", "${router}/zebra/lib/libzebra.a");
499 genSO("${root}/usr/lib/libz.so.1", "${router}/zlib/libz.a");
500 genSO("${root}/usr/lib/libjpeg.so", "${router}/jpeg/libjpeg.a");
501 #genSO("${root}/usr/lib/libsqlite3.so.0.8.6", "${router}/sqlite/.libs/libsqlite3.a");
502 genSO("${root}/usr/lib/libogg.so.0", "${router}/libogg/src/.libs/libogg.a");
503 genSO("${root}/usr/lib/libvorbis.so.0", "${router}/libvorbis/lib/.libs/libvorbis.a", "", "-L${router}/libogg/src/.libs");
504 genSO("${root}/usr/lib/libid3tag.so.0", "${router}/libid3tag/.libs/libid3tag.a", "", "-L${router}/zlib");
505 genSO("${root}/usr/lib/libexif.so.12", "${router}/libexif/libexif/.libs/libexif.a");
506 genSO("${root}/usr/lib/libFLAC.so.8", "${router}/flac/src/libFLAC/.libs/libFLAC.a", "", "-L${router}/libogg/src/.libs");
507 genSO("${root}/usr/lib/libavcodec.so.52", "${router}/ffmpeg/libavcodec/libavcodec.a", "", "-L${router}/ffmpeg/libavutil -L${router}/zlib");
508 genSO("${root}/usr/lib/libavutil.so.50", "${router}/ffmpeg/libavutil/libavutil.a", "-L${router}/zlib");
509 genSO("${root}/usr/lib/libavformat.so.52", "${router}/ffmpeg/libavformat/libavformat.a", "", "-L${router}/ffmpeg/libavutil -L${router}/ffmpeg/libavcodec -L${router}/zlib");
510 genSO("${root}/usr/lib/libsmb.so", "${router}/samba/source/bin/libsmb.a");
511 genSO("${root}/usr/lib/libbigballofmud.so", "${router}/samba3/source/bin/libbigballofmud.a");
513 genSO("${root}/usr/lib/liblzo2.so.2", "${router}/lzo/src/.libs/liblzo2.a");
514 # genSO("${root}/usr/lib/libtamba.so", "${router}/samba3/source/bin/libtamba.a");
515 # genSO("${root}/usr/lib/libiptc.so", "${router}/iptables/libiptc/libiptc.a");
516 # genSO("${root}/usr/lib/libshared.so", "${router}/shared/libshared.a");
517 # genSO("${root}/usr/lib/libnvram.so", "${router}/nvram/libnvram.a");
518 # genSO("${root}/usr/lib/libusb-1.0.so.0", "${router}/libusb10/libusb/.libs/libusb-1.0.a");
519 # genSO("${root}/usr/lib/libusb-0.1.so.4", "${router}/libusb/libusb/.libs/libusb.a", "", "-L${router}/libusb10/libusb/.libs");
521 genSO("${root}/usr/lib/libbcmcrypto.so", "${router}/libbcmcrypto/libbcmcrypto.a");
523 #shibby
524 genSO("${root}/usr/lib/libcurl.so.4.3.0", "${router}/libcurl/lib/.libs/libcurl.a", "", "-L${router}/zlib");
525 genSO("${root}/usr/lib/libevent-2.0.so.5", "${router}/libevent/.libs/libevent.a");
526 genSO("${root}/usr/lib/libdaemon.so.0.5.0", "${router}/libdaemon/libdaemon/.libs/libdaemon.a");
527 genSO("${root}/usr/lib/libiconv.so.2.5.1", "${router}/libiconv/lib/.libs/libiconv.a");
528 genSO("${root}/usr/lib/libnfnetlink.so.0.2.0", "${router}/libnfnetlink/src/.libs/libnfnetlink.a");
529 genSO("${root}/usr/lib/libsodium.so.13.0.2", "${router}/libsodium/src/libsodium/.libs/libsodium.a");
530 genSO("${root}/usr/lib/libpng.so.3.51.0", "${router}/libpng/.libs/libpng.a", "", "-L${router}/zlib");
531 genSO("${root}/usr/lib/libpng12.so.0.51.0", "${router}/libpng/.libs/libpng12.a", "", "-L${router}/zlib");
532 genSO("${root}/usr/lib/libxml2.so.2.9.1", "${router}/libxml2/.libs/libxml2.a");
534 print "\n";
536 close(LOG);
537 exit(0);