setup-hooks/separate-debug-info.sh: don't inhibit strip hook

Before the change separate-debug-info.sh did the stripping itself.
This scheme has a few problems:
1. Stripping happens only on ELF files. *.a and *.o files are skipped.
   Derivations have to do it manually. Usually incorrectly
   as they don't run $RANLIB (true for `glibc` and `musl`).
2. Stripping happens on all paths. Ideally only `stripDebugList` paths
   should be considered.
3. Host strip is called on Target files.

This change offloads stripping logic to strip hook. This strips more
files for `glibc` and `musl`. Now we can remove most $STRIP calls
from individual derivations.

Co-authored-by: Sandro <sandro.jaeckel@gmail.com>
This commit is contained in:
Sergei Trofimovich 2022-08-07 09:05:33 +01:00
parent cfd4ea64f4
commit b3b672d5a1
6 changed files with 14 additions and 34 deletions

View file

@ -531,7 +531,6 @@ buildStdenv.mkDerivation ({
header "separating debug info from $i (build ID $id)"
mkdir -p "$dst/''${id:0:2}"
$OBJCOPY --only-keep-debug "$i" "$dst/''${id:0:2}/''${id:2}.debug"
$STRIP --strip-debug "$i"
# Also a create a symlink <original-name>.debug.
ln -sfn ".build-id/''${id:0:2}/''${id:2}.debug" "$dst/../$(basename "$i")"

View file

@ -2,7 +2,6 @@ export NIX_SET_BUILD_ID=1
export NIX_LDFLAGS+=" --compress-debug-sections=zlib"
export NIX_CFLAGS_COMPILE+=" -ggdb -Wa,--compress-debug-sections"
export RUSTFLAGS+=" -g"
dontStrip=1
fixupOutputHooks+=(_separateDebugInfo)
@ -35,7 +34,6 @@ _separateDebugInfo() {
# firmware blobs in QEMU.)
(
$OBJCOPY --only-keep-debug "$i" "$dst/${id:0:2}/${id:2}.debug"
$STRIP --strip-debug "$i"
# Also a create a symlink <original-name>.debug.
ln -sfn ".build-id/${id:0:2}/${id:2}.debug" "$dst/../$(basename "$i")"

View file

@ -38,26 +38,27 @@ _doStrip() {
stripDirs() {
local cmd="$1"
local ranlibCmd="$2"
local dirs="$3"
local paths="$3"
local stripFlags="$4"
local dirsNew=
local pathsNew=
local d
for d in ${dirs}; do
if [ -e "$prefix/$d" ]; then
dirsNew="${dirsNew} $prefix/$d "
local p
for p in ${paths}; do
if [ -e "$prefix/$p" ]; then
pathsNew="${pathsNew} $prefix/$p"
fi
done
dirs=${dirsNew}
paths=${pathsNew}
if [ -n "${dirs}" ]; then
echo "stripping (with command $cmd and flags $stripFlags) in$dirs"
find $dirs -type f -exec $cmd $stripFlags '{}' \; 2>/dev/null
if [ -n "${paths}" ]; then
echo "stripping (with command $cmd and flags $stripFlags) in $paths"
# Do not strip lib/debug. This is a directory used by setup-hooks/separate-debug-info.sh.
find $paths -type f -a '!' -wholename "$prefix/lib/debug/*" -exec $cmd $stripFlags '{}' \; 2>/dev/null
# 'strip' does not normally preserve archive index in .a files.
# This usually causes linking failures against static libs like:
# ld: ...-i686-w64-mingw32-stage-final-gcc-13.0.0-lib/i686-w64-mingw32/lib/libstdc++.dll.a:
# error adding symbols: archive has no index; run ranlib to add one
# Restore the index by running 'ranlib'.
find $dirs -name '*.a' -type f -exec $ranlibCmd '{}' \; 2>/dev/null
find $paths -name '*.a' -type f -exec $ranlibCmd '{}' \; 2>/dev/null
fi
}

View file

@ -430,11 +430,6 @@ in with passthru; stdenv.mkDerivation {
# This allows build Python to import host Python's sysconfigdata
mkdir -p "$out/${sitePackages}"
ln -s "$out/lib/${libPrefix}/"_sysconfigdata*.py "$out/${sitePackages}/"
# debug info can't be separated from a static library and would otherwise be
# left in place by a separateDebugInfo build. force its removal here to save
# space in output.
$STRIP -S $out/lib/${libPrefix}/config-*/libpython*.a || true
'' + optionalString stripConfig ''
rm -R $out/bin/python*-config $out/lib/python*/config-*
'' + optionalString stripIdlelib ''

View file

@ -127,15 +127,6 @@ callPackage ./common.nix { inherit stdenv; } {
ln -sf $out/lib/libdl.so.2 $out/lib/libdl.so
ln -sf $out/lib/libutil.so.1 $out/lib/libutil.so
touch $out/lib/libpthread.a
''
# For some reason these aren't stripped otherwise and retain reference
# to bootstrap-tools; on cross-arm this stripping would break objects.
+ lib.optionalString (stdenv.hostPlatform == stdenv.buildPlatform) ''
for i in "$out"/lib/*.a; do
[ "$i" = "$out/lib/libm.a" ] || $STRIP -S "$i"
done
'' + ''
# Put libraries for static linking in a separate output. Note
# that libc_nonshared.a and libpthread_nonshared.a are required

View file

@ -102,15 +102,11 @@ stdenv.mkDerivation rec {
# Apparently glibc provides scsi itself?
(cd $dev/include && ln -s $(ls -d ${linuxHeaders}/include/* | grep -v "scsi$") .)
# Strip debug out of the static library
$STRIP -S $out/lib/libc.a
mkdir -p $out/bin
${if (stdenv.targetPlatform.libc == "musl" && stdenv.targetPlatform.isx86_32) then
"install -D libssp_nonshared.a $out/lib/libssp_nonshared.a
$STRIP -S $out/lib/libssp_nonshared.a"
else ""
${lib.optionalString (stdenv.targetPlatform.libc == "musl" && stdenv.targetPlatform.isx86_32)
"install -D libssp_nonshared.a $out/lib/libssp_nonshared.a"
}
# Create 'ldd' symlink, builtin