[pacman-dev] [PATCH 5/7] makepkg: strip debugging symbols into separate folder

Dave Reisner d at falconindy.com
Sun Sep 23 12:05:35 EDT 2012


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 at 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
> 
> 


More information about the pacman-dev mailing list