Browse Source

A little script to strip out unused portions of shared libs.

David Schleef 22 years ago
parent
commit
1f7a6c0f2d
1 changed files with 72 additions and 0 deletions
  1. 72 0
      extra/libstrip/libstrip

+ 72 - 0
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`
+