summaryrefslogtreecommitdiff
path: root/packaging/finddebuginfo.diff
blob: 3d1245e3914c9220b4f7e258e5682e75e248d422 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
--- ./scripts/find-debuginfo.sh.orig	2010-12-03 12:11:57.000000000 +0000
+++ ./scripts/find-debuginfo.sh	2011-05-11 14:46:18.000000000 +0000
@@ -127,6 +127,20 @@ debug_link()
   link_relative "$t" "$l" "$RPM_BUILD_ROOT"
 }
 
+# Compare two binaries but ignore the .note.gnu.build-id section
+elfcmp()
+{
+  local tmp1=$(mktemp -t ${1##*/}.XXXXXX)
+  local tmp2=$(mktemp -t ${2##*/}.XXXXXX)
+
+  objcopy -R .note.gnu.build-id -R .gnu_debuglink $1 $tmp1
+  objcopy -R .note.gnu.build-id -R .gnu_debuglink $2 $tmp2
+  cmp -s $tmp1 $tmp2
+  local res=$?
+  rm -f $tmp1 $tmp2
+  return $res
+}
+
 # Make a build-id symlink for id $1 with suffix $3 to file $2.
 make_id_link()
 {
@@ -145,7 +159,7 @@ make_id_link()
   local other=$(readlink -m "$root_idfile")
   other=${other#$RPM_BUILD_ROOT}
   if cmp -s "$root_idfile" "$RPM_BUILD_ROOT$file" ||
-     eu-elfcmp -q "$root_idfile" "$RPM_BUILD_ROOT$file" 2> /dev/null; then
+     elfcmp "$root_idfile" "$RPM_BUILD_ROOT$file" ; then
     # Two copies.  Maybe one has to be setuid or something.
     echo >&2 "*** WARNING: identical binaries are copied, not linked:"
     echo >&2 "        $file"
@@ -174,12 +188,18 @@ strict_error=ERROR
 $strict || strict_error=WARNING
 
 # Strip ELF binaries
-find "$RPM_BUILD_ROOT" ! -path "${debugdir}/*.debug" -type f \
-     		     \( -perm -0100 -or -perm -0010 -or -perm -0001 \) \
-		     -print |
-file -N -f - | sed -n -e 's/^\(.*\):[ 	]*.*ELF.*, not stripped/\1/p' |
-xargs --no-run-if-empty stat -c '%h %D_%i %n' |
+find $RPM_BUILD_ROOT ! -path "${debugdir}/*.debug" -type f \( -perm +111 -or -name "*.so*" -or -name "*.ko" \) -print 0 | sort -z |
+xargs --no-run-if-empty -0 stat -c '%h %D_%i %n' |
 while read nlinks inum f; do
+  case $(objdump -h $f 2>/dev/null | egrep -o '(debug[\.a-z_]*|gnu.version)') in
+    *debuglink*) continue ;;
+    *debug*) ;;
+    *gnu.version*)
+	echo "WARNING: "`echo $f | sed -e "s,^$RPM_BUILD_ROOT/*,/,"`" is already stripped!"
+	continue
+	;;
+    *) continue ;;
+  esac
   get_debugfn "$f"
   [ -f "${debugfn}" ] && continue
 
@@ -200,8 +220,11 @@ while read nlinks inum f; do
   fi
 
   echo "extracting debug info from $f"
-  id=$(/usr/lib/rpm/debugedit -b "$RPM_BUILD_DIR" -d /usr/src/debug \
-			      -i -l "$SOURCEFILE" "$f") || exit
+  mode=$(stat -c %a "$f")
+  chmod +w "$f"
+  id=$($(DEBUGEDIT=$(which debugedit 2>/dev/null); \
+      echo ${DEBUGEDIT:-/usr/lib/rpm/debugedit}) -b "$RPM_BUILD_DIR" \
+      -d /usr/src/debug -i -l "$SOURCEFILE" "$f") || exit
   if [ -z "$id" ]; then
     echo >&2 "*** ${strict_error}: No build ID note found in $f"
     $strict && exit 2
@@ -218,13 +241,25 @@ while read nlinks inum f; do
   esac
 
   mkdir -p "${debugdn}"
-  if test -w "$f"; then
-    strip_to_debug "${debugfn}" "$f"
-  else
-    chmod u+w "$f"
-    strip_to_debug "${debugfn}" "$f"
-    chmod u-w "$f"
-  fi
+  objcopy --only-keep-debug $f $debugfn || :
+  (
+    shopt -s extglob
+    strip_option="--strip-all"
+    case "$f" in
+      *.ko)
+	strip_option="--strip-debug" ;;
+      *$STRIP_KEEP_SYMTAB*)
+	if test -n "$STRIP_KEEP_SYMTAB"; then
+	  strip_option="--strip-debug"
+        fi
+        ;;
+    esac
+    if test "$NO_DEBUGINFO_STRIP_DEBUG" = true ; then
+      strip_option=
+    fi
+    objcopy --add-gnu-debuglink=$debugfn -R .comment -R .GCC.command.line $strip_option $f
+    chmod $mode $f
+  ) || :
 
   if [ -n "$id" ]; then
     make_id_link "$id" "$dn/$(basename $f)"
@@ -253,12 +288,14 @@ if [ -s "$SOURCEFILE" ]; then
   # stupid cpio creates new directories in mode 0700, fixup
   find "${RPM_BUILD_ROOT}/usr/src/debug" -type d -print0 |
   xargs --no-run-if-empty -0 chmod a+rx
+  find "${RPM_BUILD_ROOT}/usr/src/debug" -type f -print0 |
+  xargs --no-run-if-empty -0 chmod a+r
 fi
 
 if [ -d "${RPM_BUILD_ROOT}/usr/lib" -o -d "${RPM_BUILD_ROOT}/usr/src" ]; then
   ((nout > 0)) ||
   test ! -d "${RPM_BUILD_ROOT}/usr/lib" ||
-  (cd "${RPM_BUILD_ROOT}/usr/lib"; find debug -type d) |
+  (cd "${RPM_BUILD_ROOT}/usr/lib"; test ! -d debug || find debug -type d) |
   sed 's,^,%dir /usr/lib/,' >> "$LISTFILE"
 
   (cd "${RPM_BUILD_ROOT}/usr"