home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / usr / lib / rpm / find-debuginfo.sh < prev    next >
Linux/UNIX/POSIX Shell Script  |  2006-11-29  |  3KB  |  101 lines

  1. #!/bin/sh
  2. #find-debuginfo.sh - automagically generate debug info and file list
  3. #for inclusion in an rpm spec file.
  4.  
  5. if [ -z "$1" ] ; then BUILDDIR="."
  6. else BUILDDIR=$1
  7. fi
  8.  
  9. LISTFILE=$BUILDDIR/debugfiles.list
  10. SOURCEFILE=$BUILDDIR/debugsources.list
  11.  
  12. debugdir="${RPM_BUILD_ROOT}/usr/lib/debug"
  13.  
  14. echo -n > $SOURCEFILE
  15.  
  16. # Strip ELF binaries
  17. for f in `find $RPM_BUILD_ROOT ! -path "${debugdir}/*.debug" -type f \( -perm +111 -or -name "*.so*" -or -name "*.ko" \) `
  18. do
  19.     case $(objdump -h $f 2>/dev/null | egrep -o '(debug[\.a-z_]*|gnu.version)') in
  20.         *debuglink*) continue ;;
  21.         *debug*) ;;
  22.         *gnu.version*)
  23.         echo "WARNING: "`echo $f | sed -e "s,^$RPM_BUILD_ROOT/*,/,"`" is already stripped!"
  24.         continue
  25.         ;;
  26.         *) continue ;;
  27.     esac
  28.  
  29.     dn=$(dirname $f | sed -n -e "s#^$RPM_BUILD_ROOT##p")
  30.     bn=$(basename $f .debug).debug
  31.  
  32.     debugdn="${debugdir}${dn}"
  33.     debugfn="${debugdn}/${bn}"
  34.     [ -f "${debugfn}" ] && continue
  35.  
  36.     echo extracting debug info from $f
  37.     mode=$(stat -c %a $f)
  38.     chmod +w $f
  39.     /usr/lib/rpm/debugedit -b "$RPM_BUILD_DIR" -d /usr/src/debug -l "$SOURCEFILE" "$f"
  40.  
  41.     # A binary already copied into /usr/lib/debug doesn't get stripped,
  42.     # just has its file names collected and adjusted.
  43.     case "$dn" in
  44.     /usr/lib/debug/*) continue ;;
  45.     esac
  46.  
  47.     mkdir -p "${debugdn}"
  48.     objcopy --only-keep-debug $f $debugfn || :
  49.     strip_option="--strip-all"
  50.     case "$f" in
  51.         *.ko|*.a) strip_option="--strip-debug" ;;
  52.     esac
  53.     if test -n "$STRIP_KEEP_SYMTAB" ; then
  54.         strip_option="--strip-debug"
  55.     fi
  56.     if test "$NO_DEBUGINFO_STRIP_DEBUG" = true ; then
  57.         strip_option=
  58.     fi
  59.     objcopy --add-gnu-debuglink=$debugfn $strip_option $f || :
  60.     chmod $mode $f
  61. done
  62.  
  63. for f in `find $RPM_BUILD_ROOT ! -path "${debugdir}/*.debug" -type f \( -name "*.exe.mdb" -or -name "*.dll.mdb" \) `
  64. do
  65.     dn=$(dirname $f | sed -n -e "s#^$RPM_BUILD_ROOT##p")
  66.     case "$dn" in
  67.     /usr/lib/debug/*) continue ;;
  68.     esac
  69.     debugdn="${debugdir}${dn}"
  70.     mkdir -p "${debugdn}"
  71.     mv "$f" "${debugdn}"
  72. done
  73.  
  74.  
  75. mkdir -p ${RPM_BUILD_ROOT}/usr/src/debug
  76. (cd $RPM_BUILD_DIR; LANG=C sort -z -u | cpio -pd0m ${RPM_BUILD_ROOT}/usr/src/debug) < $SOURCEFILE
  77.  
  78. # trying to replace dangling and/or absolute symlink
  79. DBASE=${RPM_BUILD_ROOT}/usr/src/debug
  80. for link in `find $DBASE -type l -printf "%P\n"` ; do
  81.     link_file=`readlink $RPM_BUILD_DIR/$link`
  82.     case $link_file in
  83.         /*) is_abs=true ;;
  84.         *)  is_abs= ;;
  85.     esac
  86.     if test ! -e "$DBASE/$link" -o -n "$is_abs" ; then # dangling
  87.         rm -f "$DBASE/$link"
  88.         cp "`readlink -f $RPM_BUILD_DIR/$link`" "$DBASE/$link"
  89.     fi
  90. done
  91.  
  92. {
  93.     test -d ${RPM_BUILD_ROOT}/usr/lib/debug && echo /usr/lib/debug
  94.     echo /usr/src/debug
  95. } > $LISTFILE
  96.  
  97. for p in $(<$LISTFILE); do
  98.   find $RPM_BUILD_ROOT/$p -type f -print0 | xargs -0 -r chmod 0644
  99.   find $RPM_BUILD_ROOT/$p -type d -print0 | xargs -0 -r chmod 0755
  100. done
  101.