From 8b0d59b83a60eb504567590346119fe4cd891cad Mon Sep 17 00:00:00 2001
From: Allan McRae <allan@archlinux.org>
Date: Mon, 5 Dec 2016 14:53:08 +1000
Subject: Provide source files for useful debug packages

Debug packages are fairly useless currently because the soucre files needed
for stepping through code etc are not packaged with them. This patch adds the
needed source files to the debug package and adjusts the debug info to look at
the /usr/src/debug/ directory for them rather than the build location.  This
requires using the "debugedit" program which is provided as part of the RPM
sources.

Signed-off-by: Allan McRae <allan@archlinux.org>
---
 scripts/libmakepkg/tidy/strip.sh.in | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

(limited to 'scripts/libmakepkg/tidy')

diff --git a/scripts/libmakepkg/tidy/strip.sh.in b/scripts/libmakepkg/tidy/strip.sh.in
index 32ea6771..76562808 100644
--- a/scripts/libmakepkg/tidy/strip.sh.in
+++ b/scripts/libmakepkg/tidy/strip.sh.in
@@ -32,7 +32,12 @@ tidy_modify+=('tidy_strip')
 
 
 build_id() {
-	LANG=C readelf -n $1 | sed -n '/Build ID/ { s/.*: //p; q; }'
+	LANG=C readelf -n "$1" | sed -n '/Build ID/ { s/.*: //p; q; }'
+}
+
+source_files() {
+	LANG=C readelf "$1" --debug-dump | \
+		awk '/DW_AT_name +:/{name=$8}/DW_AT_comp_dir +:/{print $8 "/" name}'
 }
 
 strip_file() {
@@ -50,6 +55,18 @@ strip_file() {
 			return
 		fi
 
+		# copy source files to debug directory
+		local f t
+		while read -r f; do
+			t=${f/"$srcdir"/$dbgsrc}
+			mkdir -p "${t%/*}"
+			cp -- "$f" "$t"
+		done < <(source_files "$binary")
+
+		# adjust debug symbols to point at sources
+		debugedit -b "${srcdir}" -d /usr/src/debug/ -i "$binary" &> /dev/null
+
+		# copy debug symbols to debug directory
 		mkdir -p "$dbgdir/${binary%/*}"
 		objcopy --only-keep-debug "$binary" "$dbgdir/$binary.debug"
 		objcopy --add-gnu-debuglink="$dbgdir/${binary#/}.debug" "$binary"
@@ -88,8 +105,10 @@ tidy_strip() {
 		[[ -z ${STRIP_STATIC+x} ]] && STRIP_STATIC="-S"
 
 		if check_option "debug" "y"; then
+
 			dbgdir="$pkgdirbase/$pkgbase-@DEBUGSUFFIX@/usr/lib/debug"
-			mkdir -p "$dbgdir"
+			dbgsrc="$pkgdirbase/$pkgbase-@DEBUGSUFFIX@/usr/src/debug"
+			mkdir -p "$dbgdir" "$dbgsrc"
 		fi
 
 		local binary strip_flags
-- 
cgit v1.2.3-70-g09d2