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";
16 print STDERR
"\n*** ERROR: " . (shift) . "\n\n";
23 if ($fn =~ /([^\/]+)$/) {
34 ($fname =~ /\/lib\
/modules\/\d
+\
.\d
+\
.\d
+/) ||
35 ($fname =~ /\.(asp|gif|png|svg|js|jsx|css|txt|pat|sh)$/)) {
41 if (opendir($d, $fname)) {
42 foreach (readdir($d)) {
44 load
($fname . "/" . $_);
58 $base = basename
($fname);
59 print LOG
"\n\nreadelf $base:\n";
61 open($f, "mipsel-linux-readelf -WhsdD ${fname} 2>&1 |") || error
("readelf - $!\n");
66 if (/\s+Type:\s+(\w+)/) {
67 $elf_type{$base} = $1;
78 print "$elf_type{$base} $base", " " x
30, "\r";
85 if (/\(NEEDED\)\s+Shared library: \[(.+)\]/) {
86 push(@
{$elf_lib{$base}}, $1);
88 elsif (/Symbol table for image:/) {
96 if (/\s+(WEAK|GLOBAL)\s+(?:DEFAULT|VISIBLE)\s+(\w+)\s+(\w+)/) {
100 $elf_ext{$base}{$s} = 1;
103 print LOG
"*** not GLOBAL\n";
106 elsif ($2 eq 'ABS') {
108 elsif ($2 =~ /^\d+$/) {
109 $elf_exp{$base}{$s} = 1;
112 print LOG
"*** unknown type\n";
115 elsif (!/Num Buc:/) {
116 print LOG
"*** strange line\n";
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";
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");
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");
169 fixDynDep
("tincd", "liblzo2.so.2.0.0");
170 fixDynDep
("openvpn", "liblzo2.so.2.0.0");
172 #minidlna module, bwq518
173 fixDynDep
("minidlna", "libz.so.1");
174 fixDynDep
("minidlna", "libstdc.so.6");
175 fixDynDep
("minidlna", "libiconv.so.2.4.0");
176 fixDynDep
("minidlna", "libssl.so.1.0.0");
177 fixDynDep
("minidlna", "libjpeg.so");
178 fixDynDep
("minidlna", "libogg.so.0");
179 fixDynDep
("minidlna", "libvorbis.so.0");
180 fixDynDep
("minidlna", "libid3tag.so.0");
181 fixDynDep
("minidlna", "libexif.so.12");
182 fixDynDep
("minidlna", "libFLAC.so.8");
183 fixDynDep
("libjepg.so", "libc.so.0");
184 fixDynDep
("libavcodec.so.52", "libpthread.so.0");
187 fixDynDep
("mysql", "libmysqlclient.so.16.0.0");
188 fixDynDep
("my_print_defaults", "libmysqlclient.so.16.0.0");
189 fixDynDep
("myisamchk", "libmysqlclient.so.16.0.0");
190 fixDynDep
("mysqladmin", "libmysqlclient.so.16.0.0");
191 fixDynDep
("mysqld", "libmysqlclient.so.16.0.0");
192 fixDynDep
("mysqldump", "libmysqlclient.so.16.0.0");
193 fixDynDep
("mysql", "libmysqlclient_r.so.16.0.0");
194 fixDynDep
("my_print_defaults", "libmysqlclient_r.so.16.0.0");
195 fixDynDep
("myisamchk", "libmysqlclient_r.so.16.0.0");
196 fixDynDep
("mysqladmin", "libmysqlclient_r.so.16.0.0");
197 fixDynDep
("mysqld", "libmysqlclient_r.so.16.0.0");
198 fixDynDep
("mysqldump", "libmysqlclient_r.so.16.0.0");
199 fixDynDep
("libmysqlclient.so.16.0.0", "libz.so.1");
200 fixDynDep
("libmysqlclient_r.so.16.0.0", "libz.so.1");
201 fixDynDep
("libmysqlclient.so.16.0.0", "libncurses.so.5");
202 fixDynDep
("libmysqlclient_r.so.16.0.0", "libncurses.so.5");
203 fixDynDep
("libmysqlclient.so.16.0.0", "libcrypto.so.1.0.0");
204 fixDynDep
("libmysqlclient_r.so.16.0.0", "libcrypto.so.1.0.0");
205 fixDynDep
("libmysqlclient.so.16.0.0", "libssl.so.1.0.0");
206 fixDynDep
("libmysqlclient_r.so.16.0.0", "libssl.so.1.0.0");
207 fixDynDep
("mysql", "libz.so.1");
208 fixDynDep
("mysqld", "libz.so.1");
209 fixDynDep
("mysqldump", "libz.so.1");
210 fixDynDep
("myisamchk", "libz.so.1");
211 fixDynDep
("mysqladmin", "libz.so.1");
212 fixDynDep
("my_print_defaults", "libz.so.1");
213 fixDynDep
("mysql", "libncurses.so.5");
214 fixDynDep
("mysqld", "libncurses.so.5");
215 fixDynDep
("mysqldump", "libncurses.so.5");
216 fixDynDep
("myisamchk", "libncurses.so.5");
217 fixDynDep
("mysqladmin", "libncurses.so.5");
218 fixDynDep
("my_print_defaults", "libncurses.so.5");
219 fixDynDep
("mysql", "libz.so.1");
220 fixDynDep
("mysqld", "libz.so.1");
221 fixDynDep
("mysqldump", "libz.so.1");
222 fixDynDep
("myisamchk", "libz.so.1");
223 fixDynDep
("mysqladmin", "libz.so.1");
224 fixDynDep
("my_print_defaults", "libz.so.1");
225 fixDynDep
("mysql", "libncurses.so.5");
226 fixDynDep
("mysqld", "libncurses.so.5");
227 fixDynDep
("mysqldump", "libncurses.so.5");
228 fixDynDep
("myisamchk", "libncurses.so.5");
229 fixDynDep
("mysqladmin", "libncurses.so.5");
230 fixDynDep
("my_print_defaults", "libncurses.so.5");
231 fixDynDep
("mysql", "libcrypto.so.1.0.0");
232 fixDynDep
("mysqld", "libcrypto.so.1.0.0");
233 fixDynDep
("mysqldump", "libcrypto.so.1.0.0");
234 fixDynDep
("myisamchk", "libcrypto.so.1.0.0");
235 fixDynDep
("mysqladmin", "libcrypto.so.1.0.0");
236 fixDynDep
("my_print_defaults", "libcrypto.so.1.0.0");
237 fixDynDep
("mysql", "libssl.so.1.0.0");
238 fixDynDep
("mysqld", "libssl.so.1.0.0");
239 fixDynDep
("mysqldump", "libssl.so.1.0.0");
240 fixDynDep
("myisamchk", "libssl.so.1.0.0");
241 fixDynDep
("mysqladmin", "libssl.so.1.0.0");
242 fixDynDep
("my_print_defaults", "libssl.so.1.0.0");
245 fixDynDep
("libipset_iphash.so", "ipset");
246 fixDynDep
("libipset_iptree.so", "ipset");
247 fixDynDep
("libipset_ipmap.so", "ipset");
248 fixDynDep
("libipset_ipporthash.so", "ipset");
249 fixDynDep
("libipset_ipportiphash.so", "ipset");
250 fixDynDep
("libipset_ipportnethash.so", "ipset");
251 fixDynDep
("libipset_iptreemap.so", "ipset");
252 fixDynDep
("libipset_macipmap.so", "ipset");
253 fixDynDep
("libipset_nethash.so", "ipset");
254 fixDynDep
("libipset_portmap.so", "ipset");
255 fixDynDep
("libipset_setlist.so", "ipset");
257 fixDynDep
("tomatodata.cgi", "libc.so.0");
258 fixDynDep
("tomatoups.cgi", "libc.so.0");
259 fixDynDep
("apcupsd", "libc.so.0");
260 fixDynDep
("apcupsd", "libgcc_s.so.1");
261 fixDynDep
("apcaccess", "libc.so.0");
262 fixDynDep
("smtp", "libc.so.0");
264 # fixDynDep("libbcm.so", "libshared.so");
265 # fixDynDep("libbcm.so", "libc.so.0");
267 fixDynDep
("nginx", "libpcre.so.1.2.3");
268 fixDynDep
("nginx", "libpcreposix.so.0.0.2");
269 fixDynDep
("php-cgi", "libxml2.so.2.9.1");
270 fixDynDep
("php-cgi", "libpng12.so.0.51.0");
271 fixDynDep
("php-cgi", "libpng.so.3.51.0");
272 fixDynDep
("php-cgi", "libiconv.so.2.5.1");
273 fixDynDep
("php-cgi", "libsqlite3.so.0.8.6");
274 fixDynDep
("php-cli", "libxml2.so.2.9.1");
275 fixDynDep
("php-cli", "libpng12.so.0.51.0");
276 fixDynDep
("php-cli", "libpng.so.3.51.0");
277 fixDynDep
("php-cli", "libiconv.so.2.5.1");
278 fixDynDep
("php-cli", "libsqlite3.so.0.8.6");
280 #!!TB - Updated Broadcom WL driver
281 fixDynDep
("libbcmcrypto.so", "libc.so.0");
282 fixDynDep
("nas", "libbcmcrypto.so");
283 fixDynDep
("wl", "libbcmcrypto.so");
284 fixDynDep
("nas", "libc.so.0");
285 fixDynDep
("wl", "libc.so.0");
287 #Roadkill for NocatSplash
288 fixDynDep
("splashd","libglib-1.2.so.0.0.10");
301 foreach $l (@
{$elf_lib{$e}}) {
303 if ((!defined $sym) || (defined $elf_ext{$e}{$sym})) {
319 foreach $l (@
{$elf_lib{$name}}) {
320 # print "\n$l $sym ", $elf_exp{$l}{$sym}, "\n";
321 return $l if (defined $elf_exp{$l}{$sym});
323 return "*** unresolved ***";
335 # print "Resolving implicit links...\n";
337 foreach $name (@elfs) {
338 foreach $sym (keys %{$elf_ext{$name}}) {
341 if ($sym eq '__uClibc_start_main') {
342 $sym = '__uClibc_main';
345 # __gnu_local_gp is defined specially by the linker on MIPS
346 if ($sym eq '__gnu_local_gp') {
349 elsif (resolve
($name, $sym) eq "*** unresolved ***") {
350 @users = usersOf
($name);
351 foreach $u (@users) {
353 if (defined $elf_exp{$u}{$sym}) {
354 fixDynDep
($name, $u);
357 # if exported by shared libs of $u
358 if (($t = resolve
($u, $sym)) ne "*** unresolved ***") {
359 fixDynDep
($name, $t);
365 print "Unable to resolve $sym used by $name\n", @users;
381 $n = $current + (4 - ($current % 4));
382 last if ($n > $target);
386 while ($current < $target) {
400 # print "Generating Xref Report...\n";
402 open($f, ">libfoo_xref.txt");
403 foreach $fname (sort keys %elf_type) {
404 print $f "$fname:\n";
406 if (scalar(@
{$elf_lib{$fname}}) > 0) {
407 print $f "Dependency:\n";
408 foreach $s (sort @
{$elf_lib{$fname}}) {
409 print $f "\t$s", defined $elf_dyn{$fname}{$s} ?
" (dyn)\n" : "\n";
413 if (scalar(keys %{$elf_exp{$fname}}) > 0) {
414 print $f "Export:\n";
415 foreach $s (sort keys %{$elf_exp{$fname}}) {
416 @u = usersOf
($fname, $s);
417 if (scalar(@u) > 0) {
418 print $f "\t$s", tab
(length($s) + 4, 40), " > ", join(",", @u), "\n";
426 if (scalar(keys %{$elf_ext{$fname}}) > 0) {
427 print $f "External:\n";
428 foreach $s (sort keys %{$elf_ext{$fname}}) {
429 print $f "\t$s", tab
(length($s) + 4, 40), " < ", resolve
($fname, $s), "\n";
441 my ($so, $arc, $strip, $opt) = @_;
442 my $name = basename
($so);
452 print "$name: not found, skipping...\n";
458 print "$arc: not found, skipping...\n";
462 foreach $sym (sort keys %{$elf_exp{$name}}) {
463 if ((scalar(usersOf
($name, $sym)) > 0) || (${strip
} eq "no")) {
471 # print "\n$name: Attempting to link ", scalar(@used), " and remove ", scalar(@unused), " objects...\n";
473 print LOG
"\n\n${base}\n";
475 # $cmd = "mipsel-uclibc-ld -shared -s -z combreloc --warn-common --fatal-warnings ${opt} -soname ${name} -o ${so}";
476 $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}";
477 foreach (@
{$elf_lib{$name}}) {
478 if ((!$elf_dyn{$name}{$_}) && (/^lib(.+)\.so/)) {
482 # print LOG "Not marking for linkage: $_\n";
485 # print "$cmd -u... ${arc}\n";
486 if (scalar(@used) == 0) {
487 print "$name: WARNING: Library is not used by anything, deleting...\n";
492 $cmd .= " -u " . join(" -u ", @used) . " ". $arc;
494 print LOG
"Command: $cmd\n";
495 print LOG
"Used: ", join(",", @used), "\n";
496 print LOG
"Unused: ", join(",", @unused), "\n";
502 error
("ld returned $?");
507 print "$name: Attempted to remove ", scalar(@unused), "/", scalar(@unused) + scalar(@used), " symbols. ";
508 printf "%.2fK - %.2fK = %.2fK\n", $before / 1024, $after / 1024, ($before - $after) / 1024;
510 # print "\n$name: Attempting to link ", scalar(@used), " and remove ", scalar(@unused), " objects...\n";
511 # printf "Before: %.2fK / After: %.2fK / Removed: %.2fK\n\n", $before / 1024, $after / 1024, ($before - $after) / 1024;
513 return ($before > $after)
521 # print "\nlibfoo.pl - fooify shared libraries\n";
522 # print "Copyright (C) 2006-2007 Jonathan Zarate\n\n";
524 if ((!-d
$root) || (!-d
$uclibc) || (!-d
$router)) {
525 print "Missing or invalid environment variables\n";
529 open(LOG
, ">libfoo.debug");
530 #open(LOG, ">/dev/null");
532 print "Loading...\r";
534 print "Finished loading files.", " " x
30, "\r";
541 $stripshared = "yes";
542 if ($ARGV[0] eq "--noopt") {
546 genSO
("${root}/lib/libc.so.0", "${uclibc}/lib/libc.a", "", "-Wl,-init=__uClibc_init ${uclibc}/lib/optinfo/interp.os");
547 genSO
("${root}/lib/libresolv.so.0", "${uclibc}/lib/libresolv.a", "${stripshared}");
548 genSO
("${root}/lib/libcrypt.so.0", "${uclibc}/lib/libcrypt.a", "${stripshared}");
549 genSO
("${root}/lib/libm.so.0", "${uclibc}/lib/libm.a");
550 genSO
("${root}/lib/libpthread.so.0", "${uclibc}/lib/libpthread.a", "${stripshared}", "-u pthread_mutexattr_init -Wl,-init=__pthread_initialize_minimal_internal");
551 genSO
("${root}/lib/libutil.so.0", "${uclibc}/lib/libutil.a", "${stripshared}");
552 # genSO("${root}/lib/libdl.so.0", "${uclibc}/lib/libdl.a", "${stripshared}");
553 # genSO("${root}/lib/libnsl.so.0", "${uclibc}/lib/libnsl.a", "${stripshared}");
555 genSO
("${root}/usr/lib/libcrypto.so.1.0.0", "${router}/openssl/libcrypto.a");
556 genSO
("${root}/usr/lib/libssl.so.1.0.0", "${router}/openssl/libssl.a", "${stripshared}", "-L${router}/openssl");
558 genSO
("${root}/usr/lib/libzebra.so", "${router}/zebra/lib/libzebra.a");
559 genSO
("${root}/usr/lib/libz.so.1", "${router}/zlib/libz.a");
560 genSO
("${root}/usr/lib/libjpeg.so", "${router}/jpeg/libjpeg.a");
561 #genSO("${root}/usr/lib/libsqlite3.so.0.8.6", "${router}/sqlite/.libs/libsqlite3.a");
562 genSO
("${root}/usr/lib/libogg.so.0", "${router}/libogg/src/.libs/libogg.a");
563 genSO
("${root}/usr/lib/libvorbis.so.0", "${router}/libvorbis/lib/.libs/libvorbis.a", "", "-L${router}/libogg/src/.libs");
564 genSO
("${root}/usr/lib/libid3tag.so.0", "${router}/libid3tag/.libs/libid3tag.a", "", "-L${router}/zlib");
565 genSO
("${root}/usr/lib/libexif.so.12", "${router}/libexif/libexif/.libs/libexif.a");
566 genSO
("${root}/usr/lib/libFLAC.so.8", "${router}/flac/src/libFLAC/.libs/libFLAC.a", "", "-L${router}/libogg/src/.libs");
567 genSO
("${root}/usr/lib/libavcodec.so.52", "${router}/ffmpeg/libavcodec/libavcodec.a", "", "-L${router}/ffmpeg/libavutil -L${router}/zlib");
568 genSO
("${root}/usr/lib/libavutil.so.50", "${router}/ffmpeg/libavutil/libavutil.a", "-L${router}/zlib");
569 genSO
("${root}/usr/lib/libavformat.so.52", "${router}/ffmpeg/libavformat/libavformat.a", "", "-L${router}/ffmpeg/libavutil -L${router}/ffmpeg/libavcodec -L${router}/zlib");
570 genSO
("${root}/usr/lib/libsmb.so", "${router}/samba/source/bin/libsmb.a");
571 genSO
("${root}/usr/lib/libbigballofmud.so", "${router}/samba3/source/bin/libbigballofmud.a");
573 genSO
("${root}/usr/lib/liblzo2.so.2.0.0", "${router}/lzo/src/.libs/liblzo2.a");
574 # genSO("${root}/usr/lib/libtamba.so", "${router}/samba3/source/bin/libtamba.a");
575 # genSO("${root}/usr/lib/libiptc.so", "${router}/iptables/libiptc/libiptc.a");
576 # genSO("${root}/usr/lib/libshared.so", "${router}/shared/libshared.a");
577 # genSO("${root}/usr/lib/libnvram.so", "${router}/nvram/libnvram.a");
578 # genSO("${root}/usr/lib/libusb-1.0.so.0", "${router}/libusb10/libusb/.libs/libusb-1.0.a");
579 # genSO("${root}/usr/lib/libusb-0.1.so.4", "${router}/libusb/libusb/.libs/libusb.a", "", "-L${router}/libusb10/libusb/.libs");
581 genSO
("${root}/usr/lib/libbcmcrypto.so", "${router}/libbcmcrypto/libbcmcrypto.a");
584 genSO
("${root}/usr/lib/libcurl.so.4.3.0", "${router}/libcurl/lib/.libs/libcurl.a", "", "-L${router}/zlib");
585 genSO
("${root}/usr/lib/libevent-2.0.so.5", "${router}/libevent/.libs/libevent.a");
586 genSO
("${root}/usr/lib/libdaemon.so.0.5.0", "${router}/libdaemon/libdaemon/.libs/libdaemon.a");
587 genSO
("${root}/usr/lib/libiconv.so.2.5.1", "${router}/libiconv/lib/.libs/libiconv.a");
588 genSO
("${root}/usr/lib/libnfnetlink.so.0.2.0", "${router}/libnfnetlink/src/.libs/libnfnetlink.a");
589 genSO
("${root}/usr/lib/libsodium.so.13.0.2", "${router}/libsodium/src/libsodium/.libs/libsodium.a");
590 genSO
("${root}/usr/lib/libpng.so.3.51.0", "${router}/libpng/.libs/libpng.a", "", "-L${router}/zlib");
591 genSO
("${root}/usr/lib/libpng12.so.0.51.0", "${router}/libpng/.libs/libpng12.a", "", "-L${router}/zlib");
592 genSO
("${root}/usr/lib/libxml2.so.2.9.1", "${router}/libxml2/.libs/libxml2.a");