URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [linux/] [uClibc/] [extra/] [libstrip/] [libstrip] - Rev 1765
Compare with Previous | Blame | View Log
#!/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`