On Mon, Sep 24, 2012 at 12:44:33AM +1000, Allan McRae wrote:
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> --- scripts/makepkg.sh.in | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+)
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index c857060..df1823d 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -1421,8 +1421,55 @@ run_package() { run_function_safe "$pkgfunc" }
+build_id() { + local id + id=$(LANG=C readelf -n $1 | sed -n '/Build ID/ { s/.*: //p; q; }') + printf "%s\n" "$id" +}
This whole function should just be the readelf|sed: 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
quoting
+ + # 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
quoting
+ return + 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}
quoting
+ + target="../../../../../${binary#./}" + target=${target/..\/..\/usr\/lib\/} + target=${target/..\/usr\/}
Ew.
+ ln -s $target $pkgdir-debug/usr/lib/debug/.build_id/${bid:0:2}/${bid:2}
quoting
+ + target="../../${binary#./}.debug" + ln -s $target $pkgdir-debug/usr/lib/debug/.build_id/${bid:0:2}/${bid:2}.debug
quoting
+ fi + fi + strip $@ $binary }
@@ -1480,6 +1527,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
"$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 -- 1.7.12.1