summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorAllan McRae <allan@archlinux.org>2012-09-23 15:23:26 +0200
committerAllan McRae <allan@archlinux.org>2012-11-27 06:16:15 +0100
commitbd4ff4a377ce32e36e5b72bd60c0b3a59e194720 (patch)
tree9386e534c3440b8be27c519e934193055792def6 /scripts
parenta53fd796326727e3a891413762725cd4450bf986 (diff)
downloadpacman-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.in50
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