diff options
-rwxr-xr-x | extra/libstrip/libstrip | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/extra/libstrip/libstrip b/extra/libstrip/libstrip new file mode 100755 index 000000000..69a10438a --- /dev/null +++ b/extra/libstrip/libstrip @@ -0,0 +1,72 @@ +#!/usr/bin/perl -w +# vi: set ts=4: + +# Libstrip - A utility to optimize libraries for specific executables +# Copyright (C) 2001 David A. Schleef <ds@schleef.org> +# +# 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` + |