From fc44fa1f06fd8db9cdc3f37c29bb240024b10676 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sun, 12 Aug 2012 16:47:36 -0400 Subject: [PATCH] Make stripping more efficient. Finds all ELF objects and doesn't strip them twice. --- lfs/cleanup-toolchain | 23 +++++++++++++++-------- lfs/strip | 13 +------------ src/stripper | 27 +++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 20 deletions(-) create mode 100755 src/stripper diff --git a/lfs/cleanup-toolchain b/lfs/cleanup-toolchain index 1be39fef6c..5c9fd0d5b3 100644 --- a/lfs/cleanup-toolchain +++ b/lfs/cleanup-toolchain @@ -62,19 +62,26 @@ ifeq "$(PASS)" "2" # Remove the first cross compiler which is not needed anymore. find /tools/ -name "$(CROSSTARGET)*" | xargs rm -rfv - -strip --strip-debug /tools/lib/* - -strip --strip-unneeded /tools/{,s}bin/* - rm -rfv /tools/{,share}/{info,man} /usr/local/man - chown -R root:root /tools + # Remove man and info pages. + rm -rfv /tools/{,share}/{info,man} + + # Strip all binaries. + STRIP="/usr/bin/strip" $(DIR_SRC)/src/stripper /tools/ + + # Fix ownership of the toolchain. + chown -R root:root /tools/ endif + ifeq "$(PASS)" "3" mv -v /tools/bin/{ld,ld-old} mv -v /tools/$(BUILDTARGET)/bin/{ld,ld-old} mv -v /tools/bin/{ld-new,ld} ln -sv /tools/bin/ld /tools/$(BUILDTARGET)/bin/ld - gcc -dumpspecs | \ - perl -p -e 's@/tools/lib/ld-linux.so@/lib/ld-linux.so@g;' \ - -e 's@\*startfile_prefix_spec:\n@$$_/usr/lib/ @g;' > \ - /tools/lib/gcc/$(BUILDTARGET)/$(GCC_VER)/specs + + gcc -dumpspecs | sed \ + -e 's@/tools@@g' \ + -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \ + -e '/\*cpp:/{n;s@$$@ -isystem /usr/include@}' > \ + $$(dirname $$(gcc -print-libgcc-file-name))/specs endif @$(POSTBUILD) diff --git a/lfs/strip b/lfs/strip index a383439ae5..3ae1bde6f5 100644 --- a/lfs/strip +++ b/lfs/strip @@ -46,15 +46,4 @@ md5 : ############################################################################### $(TARGET) : - # Add -ls before -exec if you want to verify what files are in the path to be stripped - # A running binary can't be stripped, so use the version from /tools - # It may fail (signal 11) under circonstance not identified by me (Gilles), - # to strip libc again so ignore the error now. Probably need a static strip for libc - # Don't use --strip-all on libraries, or they'll be destroyed. Don't use --strip-unneeded, either. - -/tools/bin/find /lib /usr/lib /usr/share/rrdtool-* /install/initrd/lib \ - -type f \( -name '*.so' -o -name '*.so[\.0-9]*' \) \ - -exec /tools/bin/strip --strip-debug {} \; 2>/dev/null - - -/tools/bin/strip --strip-all /{,usr/}{,local/}{bin,sbin}/* /install/{initrd,misc}/bin/* /usr/lib/cyrus/* 2>/dev/null - -/tools/bin/strip --strip-all /usr/lib/awk/{grcat,pwcat} 2>/dev/null - -/tools/bin/strip --strip-all /usr/lib/gcc/*-linux-gnu/4.0.4/{cc1*,collect2} 2>/dev/null + STRIP="/tools/bin/strip" $(DIR_SRC)/src/stripper / diff --git a/src/stripper b/src/stripper new file mode 100755 index 0000000000..199d17f6a0 --- /dev/null +++ b/src/stripper @@ -0,0 +1,27 @@ +#!/bin/bash + +function _strip() { + local file=${1} + + local cmd="${STRIP-strip}" + + case "$(file -bi ${file})" in + application/x-sharedlib*) + cmd="${cmd} --strip-debug --remove-section=.comment --remove-section=.note" + ;; + *) + cmd="${cmd} --strip-unneeded" + ;; + esac + + echo "Stripping ${file}..." + ${cmd} ${file} +} + +for dir in $@; do + find ${dir} -type f \( -perm -0100 -or -perm -0010 -or -perm -0001 \) \ + | file -N -f - | sed -n -e 's/^\(.*\):[ ]*.*ELF.*, not stripped/\1/p' | + while read file; do + _strip ${file} + done +done -- 2.39.2