summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2001-12-29 08:00:10 +0000
committerDavid Schleef <ds@schleef.org>2001-12-29 08:00:10 +0000
commit1f7a6c0f2d9ef27f9f4196662636e7c8b97df392 (patch)
tree42976cf0fef7bab6ffc794764761af53db9035dc
parent3157236c72de816135729da9b43e98a9085e81e0 (diff)
A little script to strip out unused portions of shared libs.
-rwxr-xr-xextra/libstrip/libstrip72
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`
+