FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > ArchLinux > ArchLinux Pacman Development

 
 
LinkBack Thread Tools
 
Old 09-23-2012, 03:16 PM
Allan McRae
 
Default makepkg: strip debugging symbols into separate folder

On 24/09/12 00:44, 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
" "$id"
> +}
> +
> 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
> +
> + # 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
> + return

delete...

> + 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
> }
>
> @@ -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
> + 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
>
 
Old 09-23-2012, 04:05 PM
Dave Reisner
 
Default makepkg: strip debugging symbols into separate folder

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
" "$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
>
>
 
Old 09-23-2012, 11:51 PM
Allan McRae
 
Default makepkg: strip debugging symbols into separate folder

On 24/09/12 02:05, Dave Reisner wrote:
>> + target="../../../../../${binary#./}"
>> > + target=${target/../../usr/lib/}
>> > + target=${target/../usr/}
> Ew.


Yes... but any suggestions on how to improve it? That was the best I
could come up with.
 

Thread Tools




All times are GMT. The time now is 12:58 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org