| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 | #!/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`
 |