diff options
author | Allan McRae <allan@archlinux.org> | 2012-09-23 15:23:26 +0200 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2012-11-27 06:16:15 +0100 |
commit | bd4ff4a377ce32e36e5b72bd60c0b3a59e194720 (patch) | |
tree | 9386e534c3440b8be27c519e934193055792def6 /scripts | |
parent | a53fd796326727e3a891413762725cd4450bf986 (diff) | |
download | pacman-bd4ff4a377ce32e36e5b72bd60c0b3a59e194720.tar.gz pacman-bd4ff4a377ce32e36e5b72bd60c0b3a59e194720.tar.xz |
makepkg: strip debugging symbols into separate folder
When using the "debug" option in combination with "strip", move the
debugging symbols into a separate directory ($pkgdir-debug/usr/lib/debug)
suitable for creating a package from.
Create hardlinks between debugging symbols of hardlinked files and add
symlinks in the .build_id directory if the binary has a build ID.
Signed-off-by: Allan McRae <allan@archlinux.org>
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/makepkg.sh.in | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index 26e5d5ba..9c31da4e 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -1426,8 +1426,53 @@ run_package() { run_function_safe "$pkgfunc" } +build_id() { + LANG=C readelf -n $1 | sed -n '/Build ID/ { s/.*: //p; q; }' +} + strip_file() { local binary=$1; shift + + if check_option "debug" "y"; then + local bid=$(build_id "$binary") + + # has this file already been stripped + if [[ -n "$bid" ]]; then + if [[ -f "$pkgdir-debug"/usr/lib/debug/.build_id/${bid:0:2}/${bid:2}.debug ]]; then + return + fi + elif [[ -f "$pkgdir-debug/usr/lib/debug/$binary.debug" ]]; then + return + fi + + mkdir -p "$pkgdir-debug/usr/lib/debug/${binary%/*}" + objcopy --only-keep-debug "$binary" "$pkgdir-debug/usr/lib/debug/$binary.debug" + objcopy --add-gnu-debuglink="$pkgdir-debug/usr/lib/debug/${binary#/}.debug" "$binary" + + # create any needed hardlinks + while read -d '' file ; do + if [[ "${binary}" -ef "${file}" && + ! -f "$pkgdir-debug/usr/lib/debug/${file}.debug" ]]; then + mkdir -p "$pkgdir-debug/usr/lib/debug/${file%/*}" + ln "$pkgdir-debug/usr/lib/debug/${binary}.debug" \ + "$pkgdir-debug/usr/lib/debug/${file}.debug" + fi + done < <(find . -type f -perm -u+w -print0 2>/dev/null) + + if [[ -n "$bid" ]]; then + local target + mkdir -p "$pkgdir-debug/usr/lib/debug/.build_id/${bid:0:2}" + + target="../../../../../${binary#./}" + target="${target/..\/..\/usr\/lib\/}" + target="${target/..\/usr\/}" + ln -s "$target" "$pkgdir-debug/usr/lib/debug/.build_id/${bid:0:2}/${bid:2}" + + target="../../${binary#./}.debug" + ln -s "$target" "$pkgdir-debug/usr/lib/debug/.build_id/${bid:0:2}/${bid:2}.debug" + fi + fi + strip $@ "$binary" } @@ -1485,6 +1530,11 @@ tidy_install() { # make sure library stripping variables are defined to prevent excess stripping [[ -z ${STRIP_SHARED+x} ]] && STRIP_SHARED="-S" [[ -z ${STRIP_STATIC+x} ]] && STRIP_STATIC="-S" + + if check_option "debug" "y"; then + mkdir -p $pkgdir-debug/usr/lib/debug + fi + local binary strip_flags find . -type f -perm -u+w -print0 2>/dev/null | while read -d '' binary ; do case "$(file -bi "$binary")" in |