#!/bin/bash # Copyright 1999-2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Id$ source "${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}"/isolated-functions.sh banner=false SKIP_STRIP=false if hasq nostrip ${FEATURES} || \ hasq strip ${RESTRICT} then SKIP_STRIP=true banner=true hasq installsources ${FEATURES} || exit 0 fi STRIP=${STRIP:-${CHOST}-strip} type -P -- ${STRIP} > /dev/null || STRIP=strip OBJCOPY=${OBJCOPY:-${CHOST}-objcopy} type -P -- ${OBJCOPY} > /dev/null || OBJCOPY=objcopy # We'll leave out -R .note for now until we can check out the relevance # of the section when it has the ALLOC flag set on it ... export SAFE_STRIP_FLAGS="--strip-unneeded" export PORTAGE_STRIP_FLAGS=${PORTAGE_STRIP_FLAGS-${SAFE_STRIP_FLAGS} -R .comment} if hasq installsources ${FEATURES} && ! type -P debugedit >/dev/null ; then ewarn "FEATURES=installsources is enabled but the debugedit binary could not" ewarn "be found. This feature will not work unless debugedit is installed!" fi save_elf_sources() { hasq installsources ${FEATURES} || return 0 hasq installsources ${RESTRICT} && return 0 type -P debugedit >/dev/null || return 0 local x=$1 local sources_dir=/usr/src/debug/${CATEGORY}/${PF} debugedit -b "${WORKDIR}" -d "${sources_dir}" \ -l "${T}"/debug.sources "${x}" if [[ -s ${T}/debug.sources ]] ; then [[ -d ${D}${sources_dir} ]] || mkdir -p "${D}${sources_dir}" grep -zv '/$' "${T}"/debug.sources | \ (cd "${WORKDIR}"; LANG=C sort -z -u | \ rsync -rtL0 --files-from=- "${WORKDIR}/" "${D}${sources_dir}/" ) fi } save_elf_debug() { hasq splitdebug ${FEATURES} || return 0 local x=$1 local y="${D}usr/lib/debug/${x:${#D}}.debug" # dont save debug info twice [[ ${x} == *".debug" ]] && return 0 mkdir -p $(dirname "${y}") ${OBJCOPY} --only-keep-debug "${x}" "${y}" ${OBJCOPY} --add-gnu-debuglink="${y}" "${x}" [[ -g ${x} ]] && chmod go-r "${y}" [[ -u ${x} ]] && chmod go-r "${y}" chmod a-x,o-w "${y}" } # The existance of the section .symtab tells us that a binary is stripped. # We want to log already stripped binaries, as this may be a QA violation. # They prevent us from getting the splitdebug data. if ! hasq binchecks ${RESTRICT} && \ ! hasq strip ${RESTRICT} ; then f=$(scanelf -yqRBF '#k%F' -k '!.symtab' "$@") if [[ -n ${f} ]] ; then vecho -e "\a\n" eqawarn "QA Notice: Pre-stripped files found:" eqawarn "${f}" echo "${f}" > "${T}"/scanelf-already-stripped.log fi fi # Now we look for unstripped binaries. for x in \ $(scanelf -yqRBF '#k%F' -k '.symtab' "$@") \ $(find "$@" -type f -name '*.a') do if ! ${banner} ; then vecho "strip: ${STRIP} ${PORTAGE_STRIP_FLAGS}" banner=true fi f=$(file "${x}") || continue [[ -z ${f} ]] && continue if ! ${SKIP_STRIP} ; then # The noglob funk is to support STRIP_MASK="/*/booga" and to keep # the for loop from expanding the globs. # The eval echo is to support STRIP_MASK="/*/{booga,bar}" sex. set -o noglob strip_this=true for m in $(eval echo ${STRIP_MASK}) ; do [[ ${x} == ${m} ]] && strip_this=false && break done set +o noglob else strip_this=false fi # only split debug info for final linked objects # or kernel modules as debuginfo for intermediatary # files (think crt*.o from gcc/glibc) is useless and # actually causes problems. install sources for all # elf types though cause that stuff is good. if [[ ${f} == *"current ar archive"* ]] ; then vecho " ${x:${#D}}" if ${strip_this} ; then # hmm, can we split debug/sources for .a ? ${STRIP} -g "${x}" fi elif [[ ${f} == *"SB executable"* || ${f} == *"SB shared object"* ]] ; then vecho " ${x:${#D}}" save_elf_sources "${x}" if ${strip_this} ; then save_elf_debug "${x}" ${STRIP} ${PORTAGE_STRIP_FLAGS} "${x}" fi elif [[ ${f} == *"SB relocatable"* ]] ; then vecho " ${x:${#D}}" save_elf_sources "${x}" if ${strip_this} ; then [[ ${x} == *.ko ]] && save_elf_debug "${x}" ${STRIP} ${SAFE_STRIP_FLAGS} "${x}" fi fi done