--- scripts/find-debuginfo.sh +++ scripts/find-debuginfo.sh @@ -14,9 +14,18 @@ echo -n > $SOURCEFILE # Strip ELF binaries -for f in `find $RPM_BUILD_ROOT ! -path "${debugdir}/*.debug" -type f \( -perm -0100 -or -perm -0010 -or -perm -0001 \) -exec file {} \; | \ - sed -n -e 's/^\(.*\):[ ]*.*ELF.*, not stripped/\1/p'` +for f in `find $RPM_BUILD_ROOT ! -path "${debugdir}/*.debug" -type f \( -perm +111 -or -name "*.so*" -or -name "*.ko" \) ` 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 + dn=$(dirname $f | sed -n -e "s#^$RPM_BUILD_ROOT##p") bn=$(basename $f .debug).debug @@ -25,6 +34,8 @@ [ -f "${debugfn}" ] && continue echo extracting debug info from $f + mode=$(stat -c %a $f) + chmod +w $f /usr/lib/rpm/debugedit -b "$RPM_BUILD_DIR" -d /usr/src/debug -l "$SOURCEFILE" "$f" # A binary already copied into /usr/lib/debug doesn't get stripped, @@ -34,19 +45,60 @@ esac mkdir -p "${debugdn}" - if test -w "$f"; then - eu-strip -f "${debugfn}" "$f" || : - else - chmod u+w "$f" - eu-strip -f "${debugfn}" "$f" || : - chmod u-w "$f" + objcopy --only-keep-debug $f $debugfn || : + strip_option="--strip-all" + case "$f" in + *.ko|*.a) + 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 $strip_option $f || : + chmod $mode $f done +#for f in `find $RPM_BUILD_ROOT ! -path "${debugdir}/*.debug" -type f \( -name "*.exe.mdb" -or -name "*.dll.mdb" \) ` +#do +# dn=$(dirname $f | sed -n -e "s#^$RPM_BUILD_ROOT##p") +# case "$dn" in +# /usr/lib/debug/*) continue ;; +# esac +# debugdn="${debugdir}${dn}" +# mkdir -p "${debugdn}" +# mv "$f" "${debugdn}" +#done + + mkdir -p ${RPM_BUILD_ROOT}/usr/src/debug -cat $SOURCEFILE | (cd $RPM_BUILD_DIR; LANG=C sort -z -u | cpio -pd0m ${RPM_BUILD_ROOT}/usr/src/debug) -# stupid cpio creates new directories in mode 0700, fixup -find ${RPM_BUILD_ROOT}/usr/src/debug -type d -print0 | xargs -0 chmod a+rx +(cd $RPM_BUILD_DIR; LANG=C sort -z -u | cpio -pd0m ${RPM_BUILD_ROOT}/usr/src/debug) < $SOURCEFILE + +# trying to replace dangling and/or absolute symlink +DBASE=${RPM_BUILD_ROOT}/usr/src/debug +for link in `find $DBASE -type l -printf "%P\n"` ; do + link_file=`readlink $RPM_BUILD_DIR/$link` + case $link_file in + /*) is_abs=true ;; + *) is_abs= ;; + esac + if test ! -e "$DBASE/$link" -o -n "$is_abs" ; then # dangling + rm -f "$DBASE/$link" + cp "`readlink -f $RPM_BUILD_DIR/$link`" "$DBASE/$link" + fi +done -find ${RPM_BUILD_ROOT}/usr/lib/debug -type f | sed -n -e "s#^$RPM_BUILD_ROOT##p" > $LISTFILE -find ${RPM_BUILD_ROOT}/usr/src/debug -mindepth 1 -maxdepth 1 | sed -n -e "s#^$RPM_BUILD_ROOT##p" >> $LISTFILE +{ + test -d ${RPM_BUILD_ROOT}/usr/lib/debug && echo /usr/lib/debug + echo /usr/src/debug +} > $LISTFILE + +for p in $(<$LISTFILE); do + find $RPM_BUILD_ROOT/$p -type f -print0 | xargs -0 -r chmod 0644 + find $RPM_BUILD_ROOT/$p -type d -print0 | xargs -0 -r chmod 0755 +done