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:
parent
cfd4ea64f4
commit
b3b672d5a1
6 changed files with 14 additions and 34 deletions
|
@ -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")"
|
||||
|
|
|
@ -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")"
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 ''
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue