[OpenWrt-Devel] [RFC] openwrt: Allow extraction of debuginfo from all binaries

Helmut Schaa helmut.schaa at googlemail.com
Thu Jul 24 11:26:03 EDT 2014


Introduce a new config symbol EXTRACT_DEBUGINFO to extract debuginfo
from all binaries. This depends on USE_STRIP and DEBUG.

The debuginfo of all packages will be extracted from the binary
and copied into "bin/$platform/debuginfo".

This allows better debugging of coredumps by loading the debuginfo
into gdb.

Signed-off-by: Helmut Schaa <helmut.schaa at googlemail.com>
---

Any comments?
Helmut

 config/Config-build.in   | 10 ++++++++++
 include/package-ipkg.mk  |  5 ++++-
 rules.mk                 |  9 +++++++++
 scripts/extract-debug.sh | 41 +++++++++++++++++++++++++++++++++++++++++
 4 files changed, 64 insertions(+), 1 deletion(-)
 create mode 100644 scripts/extract-debug.sh

diff --git a/config/Config-build.in b/config/Config-build.in
index 371ae76..60b0975 100644
--- a/config/Config-build.in
+++ b/config/Config-build.in
@@ -165,6 +165,16 @@ menu "Global build settings"
 			  This will install binaries stripped using sstrip
 	endchoice
 
+	config EXTRACT_DEBUGINFO
+		bool
+		prompt "Extract debug info from binaries"
+		depends on USE_STRIP
+		depends on DEBUG
+		default n
+		help
+			Extract debuginfo from binaries for better cross debugging without
+			wasting space on the target device.
+
 	config STRIP_ARGS
 		string
 		prompt "Strip arguments"
diff --git a/include/package-ipkg.mk b/include/package-ipkg.mk
index 9783a63..b64775e 100644
--- a/include/package-ipkg.mk
+++ b/include/package-ipkg.mk
@@ -76,6 +76,7 @@ ifeq ($(DUMP),)
   define BuildTarget/ipkg
     IPKG_$(1):=$(PACKAGE_DIR)/$(1)_$(VERSION)_$(PKGARCH).ipk
     IDIR_$(1):=$(PKG_BUILD_DIR)/ipkg-$(PKGARCH)/$(1)
+    DDIR_$(1):=$(PKG_BUILD_DIR)/debuginfo-$(PKGARCH)
     KEEP_$(1):=$(strip $(call Package/$(1)/conffiles))
 
     ifeq ($(BUILD_VARIANT),$$(if $$(VARIANT),$$(VARIANT),$(BUILD_VARIANT)))
@@ -134,7 +135,7 @@ ifeq ($(DUMP),)
     $(PKG_INFO_DIR)/$(1).provides: $$(IPKG_$(1))
     $$(IPKG_$(1)): $(STAMP_BUILT) $(INCLUDE_DIR)/package-ipkg.mk
 	@rm -rf $(PACKAGE_DIR)/$(1)_* $$(IDIR_$(1))
-	mkdir -p $(PACKAGE_DIR) $$(IDIR_$(1))/CONTROL $(PKG_INFO_DIR)
+	mkdir -p $(PACKAGE_DIR) $(DEBUGINFO_DIR) $$(IDIR_$(1))/CONTROL $(PKG_INFO_DIR) $$(DDIR_$(1))
 	$(call Package/$(1)/install,$$(IDIR_$(1)))
 	-find $$(IDIR_$(1)) -name 'CVS' -o -name '.svn' -o -name '.#*' -o -name '*~'| $(XARGS) rm -rf
 	@( \
@@ -148,6 +149,7 @@ ifeq ($(DUMP),)
 	$(if $(PROVIDES), at for pkg in $(PROVIDES); do cp $(PKG_INFO_DIR)/$(1).provides $(PKG_INFO_DIR)/$$$$pkg.provides; done)
 	$(CheckDependencies)
 
+	$(EXTRACT_DEBUG) $$(DDIR_$(1)) $$(IDIR_$(1))
 	$(RSTRIP) $$(IDIR_$(1))
 	( \
 		echo "Package: $(1)"; \
@@ -187,6 +189,7 @@ ifeq ($(DUMP),)
 		)
     endif
 
+	if [ -e $$(DDIR_$(1))/* ]; then cp -r $$(DDIR_$(1))/* $(DEBUGINFO_DIR)/ ; fi
 	$(IPKG_BUILD) $$(IDIR_$(1)) $(PACKAGE_DIR)
 	@[ -f $$(IPKG_$(1)) ]
 
diff --git a/rules.mk b/rules.mk
index a84636a..6d01c76 100644
--- a/rules.mk
+++ b/rules.mk
@@ -98,6 +98,7 @@ else
 endif
 
 PACKAGE_DIR:=$(BIN_DIR)/packages
+DEBUGINFO_DIR:=$(BIN_DIR)/debuginfo
 BUILD_DIR:=$(BUILD_DIR_BASE)/$(TARGET_DIR_NAME)
 STAGING_DIR:=$(TOPDIR)/staging_dir/$(TARGET_DIR_NAME)
 BUILD_DIR_TOOLCHAIN:=$(BUILD_DIR_BASE)/$(TOOLCHAIN_DIR_NAME)
@@ -257,6 +258,14 @@ else
     $(SCRIPT_DIR)/rstrip.sh
 endif
 
+ifeq ($(CONFIG_EXTRACT_DEBUGINFO),y)
+  EXTRACT_DEBUG:= \
+    OBJCOPY=$(TARGET_CROSS)objcopy \
+    $(SCRIPT_DIR)/extract-debug.sh
+else
+  EXTRACT_DEBUG:=:
+endif
+
 ifeq ($(CONFIG_IPV6),y)
   DISABLE_IPV6:=
 else
diff --git a/scripts/extract-debug.sh b/scripts/extract-debug.sh
new file mode 100644
index 0000000..188be2d
--- /dev/null
+++ b/scripts/extract-debug.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+# 
+# Copyright (C) 2014 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+SELF=${0##*/}
+
+[ -z "$OBJCOPY" ] && {
+  echo "$SELF: objcopy command not defined (OBJCOPY variable not set)"
+  exit 1
+}
+
+DESTDIR=$1
+
+[ -z "$DESTDIR" ] && {
+  echo "$SELF: no destdir specified"
+  exit 1
+}
+
+TARGET=$2
+
+[ -z "$TARGET" ] && {
+  echo "$SELF: no directories / files specified"
+  echo "usage: $SELF [PATH...]"
+  exit 1
+}
+
+find $TARGET -type f -a -exec file {} \; | \
+  sed -n -e 's/^\(.*\):.*ELF.*\(executable\|shared object\).*,.* stripped/\1:\2/p' | \
+(
+  IFS=":"
+  while read F S; do
+    echo "$SELF: $F:$S"
+    eval "mkdir -p $DESTDIR/`echo ${F%/*} | sed s#$TARGET##`"
+    eval "$OBJCOPY --only-keep-debug $F $DESTDIR/`echo $F | sed s#$TARGET##`.debug"
+    eval "$OBJCOPY --add-gnu-debuglink=$DESTDIR/`echo $F | sed s#$TARGET##`.debug $F"
+  done
+  true
+)
-- 
1.8.4.5
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list