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 <[email protected]>
> ---
>  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
> 
> 

Reply via email to