about summary refs log tree commit diff
path: root/pkgs/build-support/setup-hooks/separate-debug-info.sh
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2015-09-17 15:24:32 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2015-09-17 15:56:33 +0200
commitec5b66eb4add9d494d8fb16f6899028750d317a2 (patch)
tree2e973c6d3e89612cfeba5eafac4810dc968bebf9 /pkgs/build-support/setup-hooks/separate-debug-info.sh
parentedee7f172098921f13466bc1d82faee423035700 (diff)
Enable separate debug info
You can now pass

  separateDebugInfo = true;

to mkDerivation. This causes debug info to be separated from ELF
binaries and stored in the "debug" output. The advantage is that it
enables installing lean binaries, while still having the ability to
make sense of core dumps, etc.
Diffstat (limited to 'pkgs/build-support/setup-hooks/separate-debug-info.sh')
-rw-r--r--pkgs/build-support/setup-hooks/separate-debug-info.sh37
1 files changed, 37 insertions, 0 deletions
diff --git a/pkgs/build-support/setup-hooks/separate-debug-info.sh b/pkgs/build-support/setup-hooks/separate-debug-info.sh
new file mode 100644
index 0000000000000..6369189920906
--- /dev/null
+++ b/pkgs/build-support/setup-hooks/separate-debug-info.sh
@@ -0,0 +1,37 @@
+export NIX_LDFLAGS+=" --build-id"
+export NIX_CFLAGS_COMPILE+=" -ggdb"
+dontStrip=1
+
+fixupOutputHooks+=(_separateDebugInfo)
+
+_separateDebugInfo() {
+    local dst="${debug:-$out}"
+    if [ "$prefix" = "$dst" ]; then return; fi
+
+    dst="$dst/lib/debug/.build-id"
+
+    # Find executables and dynamic libraries.
+    local -a files=($(find "$prefix" -type f -a \( -perm /0100 -o -name "*.so" -o -name "*.so.*" \)))
+
+    local i magic
+    for i in "${files[@]}"; do
+        # Skip non-ELF files.
+        exec 10< "$i"
+        read -n 4 -u 10 magic
+        if [[ "$magic" =~ ELF ]]; then echo FOO; fi
+        exec 10<&-
+
+        # Extract the Build ID. FIXME: there's probably a cleaner way.
+        local id="$(readelf -n "$i" | sed 's/.*Build ID: \([0-9a-f]*\).*/\1/; t; d')"
+        if [ "${#id}" != 40 ]; then
+            echo "could not find build ID of $i, skipping" >&2
+            continue
+        fi
+
+        # Extract the debug info.
+        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"
+    done
+}