From d5bb6a1f9c0c099738a37ce2e923cd71d85b5145 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Sun, 28 Feb 2016 02:57:37 +0100 Subject: [PATCH] glibc: Enable separate debug symbols The importance of glibc makes it worthwhile to provide debug symbols. However, this revealed an issue with separateDebugInfo: it was indiscriminately adding --build-id to all ld invocations, while in fact it should only do that for final links. Glibc also uses non-final ("relocatable") links, leading to subsequent failure to apply a build ID ("Cannot create .note.gnu.build-id section, --build-id ignored"). So now ld-wrapper.sh only passes --build-id for final links. --- pkgs/build-support/cc-wrapper/ld-wrapper.sh | 17 ++++++++++++++++- .../setup-hooks/separate-debug-info.sh | 3 ++- pkgs/development/libraries/glibc/builder.sh | 4 ++++ pkgs/development/libraries/glibc/default.nix | 19 +++---------------- 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/pkgs/build-support/cc-wrapper/ld-wrapper.sh b/pkgs/build-support/cc-wrapper/ld-wrapper.sh index 6ef06eb7034..449a8645904 100644 --- a/pkgs/build-support/cc-wrapper/ld-wrapper.sh +++ b/pkgs/build-support/cc-wrapper/ld-wrapper.sh @@ -146,11 +146,26 @@ if [ "$NIX_DONT_SET_RPATH" != 1 ]; then # Finally, add `-rpath' switches. for i in $rpath; do - extra=(${extra[@]} -rpath $i) + extra+=(-rpath $i) done fi +# Only add --build-id if this is a final link. FIXME: should build gcc +# with --enable-linker-build-id instead? +if [ "$NIX_SET_BUILD_ID" = 1 ]; then + for p in "${params[@]}"; do + if [ "$p" = "-r" -o "$p" = "--relocatable" -o "$p" = "-i" ]; then + relocatable=1 + break + fi + done + if [ -z "$relocatable" ]; then + extra+=(--build-id) + fi +fi + + # Optionally print debug info. if [ -n "$NIX_DEBUG" ]; then echo "original flags to @prog@:" >&2 diff --git a/pkgs/build-support/setup-hooks/separate-debug-info.sh b/pkgs/build-support/setup-hooks/separate-debug-info.sh index d2d8386c92d..518be964733 100644 --- a/pkgs/build-support/setup-hooks/separate-debug-info.sh +++ b/pkgs/build-support/setup-hooks/separate-debug-info.sh @@ -1,4 +1,5 @@ -export NIX_LDFLAGS+=" --build-id --compress-debug-sections" +export NIX_SET_BUILD_ID=1 +export NIX_LDFLAGS+=" --compress-debug-sections=zlib" export NIX_CFLAGS_COMPILE+=" -ggdb -Wa,--compress-debug-sections" dontStrip=1 diff --git a/pkgs/development/libraries/glibc/builder.sh b/pkgs/development/libraries/glibc/builder.sh index d0684d6194d..d60b143a1ec 100644 --- a/pkgs/development/libraries/glibc/builder.sh +++ b/pkgs/development/libraries/glibc/builder.sh @@ -37,6 +37,10 @@ postInstall() { # Get rid of more unnecessary stuff. rm -rf $out/var $out/sbin/sln + + for i in $out/lib/*.a; do + strip -S "$i" + done } genericBuild diff --git a/pkgs/development/libraries/glibc/default.nix b/pkgs/development/libraries/glibc/default.nix index 5e25c2dc8bc..2630cdb127f 100644 --- a/pkgs/development/libraries/glibc/default.nix +++ b/pkgs/development/libraries/glibc/default.nix @@ -2,7 +2,6 @@ , installLocales ? true , profilingLibraries ? false , gccCross ? null -, debugSymbols ? false , withGd ? false, gd ? null, libpng ? null }: @@ -13,9 +12,7 @@ let cross = if gccCross != null then gccCross.target else null; in build cross ({ - name = "glibc" - + lib.optionalString debugSymbols "-debug" - + lib.optionalString withGd "-gd"; + name = "glibc" + lib.optionalString withGd "-gd"; inherit lib stdenv fetchurl linuxHeaders installLocales profilingLibraries gccCross withGd gd libpng; @@ -38,23 +35,13 @@ in fi ''; + separateDebugInfo = true; + meta.description = "The GNU C Library"; } // - (if debugSymbols - then { - # Build with debugging symbols, but leave optimizations on and don't - # attempt to keep the build tree. - dontStrip = true; - dontCrossStrip = true; - NIX_STRIP_DEBUG = 0; - } - else {}) - - // - (if cross != null then { preConfigure = ''