#!/usr/bin/perl -w # vi: set ts=4: # Libstrip - A utility to optimize libraries for specific executables # Copyright (C) 2001 David A. Schleef # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # This is a surprisingly simple script that gets a list of # unresolved symbols in a list of executables specified on the # command line, and then relinks the uClibc shared object file # with only the those symbols and their dependencies. This # results in a shared object that is optimized for the executables # listed, and thus may not work with other executables. # # Example: optimizing uClibc for BusyBox # Compile uClibc and BusyBox as normal. Then, in this # directory, run: # libstrip path/to/busybox # After the script completes, there should be a new # libuClibc-0.9.5.so in the current directory, which # is optimized for busybox. # # How it works: # The uClibc Makefiles create libuClibc.so by first creating # the ar archive libc.a with all the object files, then links # the final libuClibc.so by using 'ld --shared --whole-archive'. # We take advantage of the linker command line option --undefined, # which pulls in a symbol and all its dependencies, and so relink # the library using --undefined for each symbol in place of # --whole-archive. The linker script is used only to avoid # having very long command lines. $topdir="../.."; # This is the name of the default ldscript for shared libs. The # file name will be different for other architectures. $ldscript="/usr/lib/ldscripts/elf_i386.xs"; my @syms; my @allsyms; my $s; while($exec = shift @ARGV){ #print "$exec\n"; @syms=`nm --dynamic $exec`; for $s (@syms){ chomp $s; if($s =~ m/^.{8} [BUV] (.+)/){ my $x = $1; if(!grep { m/^$x$/; } @allsyms){ unshift @allsyms, $x; } } } } open(LDSCRIPT, ">ldscript"); print LDSCRIPT "INCLUDE $ldscript\n"; for $s (@allsyms) { print LDSCRIPT "EXTERN($s)\n"; } `gcc -s -nostdlib -Wl,-warn-common -shared \\ -o libuClibc-0.9.5.so \\ -Wl,-soname,libc.so.0 -Wl,--script=ldscript \\ $topdir/libc/libc.a \\ $topdir/libc/tmp/libgcc-need.a`