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.
38 lines
1.1 KiB
Bash
38 lines
1.1 KiB
Bash
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
|
|
}
|