#!@SH@ # # opkhelper # src/oh-strip.sh # Strip binary objects of symbols. # # Copyright (C) 2012 Patrick "P. J." McDermott # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . . '@pkgdatadir@/load.sm' CR=' ' KEEP_DEBUG='false' main() { dir='dest' oh_init while getopts 'd:k' opt; do case "${opt}" in d) dir="${OPTARG}" ;; k) KEEP_DEBUG='true' ;; ?) oh_error "$(oh_get_msg 'bad_opt')" exit 1 ;; esac done find "${dir}" -type f -a ! -path '*/debug/*' -a -name '*.so*' | \ while IFS="${CR}" read file; do if file "${file}" | grep 'ELF.*shared' \ >/dev/null 2>&1; then file="${file#${dir}}" file="/${file##/}" strip_so "${file}" fi done find "${dir}" -type f -a ! -path '*/debug/*' -a -perm '-a+x' | \ while IFS="${CR}" read file; do if file "${file}" | grep -E 'ELF.*(executable|shared)' \ >/dev/null 2>&1; then file="${file#${dir}}" file="/${file##/}" strip_exe "${file}" fi done find "${dir}" -type f -a ! -path '*/debug/*' -a -name 'lib*.a' \ -a ! -name '*_g.a' | while IFS="{CR}" read file; do file="${file#${dir}}" file="/${file##/}" strip_a "${file}" done } strip_so() { file="${1}" debug='' oh_info "$(oh_get_msg 'strip_so')" "${file}" if ${KEEP_DEBUG}; then debug="$(keep_debug "${file}")" fi ${STRIP} --remove-section=.comment --remove-section=.note \ --strip-unneeded "${dir}/${file}" if [ -n "${debug}" ]; then link_debug "${file}" "${debug}" fi } strip_exe() { file="${1}" debug='' oh_info "$(oh_get_msg 'strip_exe')" "${file}" if ${KEEP_DEBUG}; then debug="$(keep_debug "${file}")" fi ${STRIP} --remove-section=.comment --remove-section=.note \ "${dir}/${file}" if [ -n "${debug}" ]; then link_debug "${file}" "${debug}" fi } strip_a() { file="${1}" oh_info "$(oh_get_msg 'strip_a')" "${file}" ${STRIP} --strip-debug "${dir}/${file}" } keep_debug() { file="${1}" build_id_parts='' debug='' if ! file "${dir}/${file}" | grep 'not stripped' >/dev/null 2>&1; then return fi build_id_parts="$(${READELF} -n "${dir}/${file}" | sed -n \ 's/^.*Build ID: \([0-9a-f][0-9a-f]\)\([0-9a-f]*\)$/\1 \2/p')" if [ -z "${build_id_parts}" ]; then return fi debug="/usr/lib/debug/.build-id/${build_id_parts% *}" debug="${debug}/${build_id_parts#* }.debug" mkdir -p "${dir}/${debug%/*}" ${OBJCOPY} --only-keep-debug --compress-debug-sections \ "${dir}/${file}" "${dir}/${debug}" chmod 644 "${dir}/${debug}" printf '%s\n' "${debug}" } link_debug() { file="${1}" debug="${2}" ${OBJCOPY} --add-gnu-debuglink="${dir}/${debug}" "${dir}/${file}" } main "${@}"