]> git.ipfire.org Git - ipfire-2.x.git/commitdiff
Make stripping more efficient.
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 12 Aug 2012 20:47:36 +0000 (16:47 -0400)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 12 Aug 2012 20:47:36 +0000 (16:47 -0400)
Finds all ELF objects and doesn't strip them twice.

lfs/cleanup-toolchain
lfs/strip
src/stripper [new file with mode: 0755]

index 1be39fef6ca6580c614957aa31aa468a24752fa9..5c9fd0d5b3598a6a2c207d04b7e792a3091a915b 100644 (file)
@@ -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)
index a383439ae5e76dd74b5a3f31ac9cfe52677b3a04..3ae1bde6f5241b69de99eab65661b2913b227c9f 100644 (file)
--- 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 (executable)
index 0000000..199d17f
--- /dev/null
@@ -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