Make stripping more efficient.

Finds all ELF objects and doesn't strip them twice.
This commit is contained in:
Michael Tremer
2012-08-12 16:47:36 -04:00
parent 21e72899d9
commit fc44fa1f06
3 changed files with 43 additions and 20 deletions

View 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)

View File

@@ -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 /

27
src/stripper Executable file
View File

@@ -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