1#!/bin/sh 2# 3# $OpenBSD: ctfstrip,v 1.12 2019/10/15 10:27:25 mpi Exp $ 4# 5# Copyright (c) 2017 Martin Pieuchot 6# 7# Permission to use, copy, modify, and distribute this software for any 8# purpose with or without fee is hereby granted, provided that the above 9# copyright notice and this permission notice appear in all copies. 10# 11# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 19set -o posix 20 21cleanup() { 22 rm -f ${TMPFILE} 23 exit 1 24} 25 26usage() { 27 echo "usage: $(basename $0) [-S] [-o outfile] file" >&2 28 exit 1 29} 30 31trap "cleanup" 1 2 3 13 15 32 33while getopts So: opt; do 34 case $opt in 35 S) STRIPFLAG=-g;; 36 o) OUTFILE="$OPTARG";; 37 \?) usage;; 38 esac 39done 40 41shift $((OPTIND - 1)) 42 43if [ $# -ne 1 ]; then 44 usage 45fi 46 47INFILE="$1" 48LABEL="unknown" 49TMPFILE=$(mktemp /tmp/.ctf.XXXXXXXXXX) 50 51# Extract kernel version 52if [ -z "${INFILE##bsd*}" ]; then 53 LABEL=`what "$INFILE" | sed -n '$s/^ //p'` 54fi 55 56# If ctfstrip was passed a file that lacks useful debug sections, ctfconv will 57# fail. So try to run ctfconv and silently fallback to plain strip(1) if that 58# failed. 59ctfconv -o ${TMPFILE} -l "${LABEL}" "${INFILE}" 2> /dev/null 60 61if [ $? -eq 0 ]; then 62 objcopy ${STRIPFLAG} \ 63 --add-section .SUNW_ctf=${TMPFILE} "${INFILE}" ${OUTFILE} 64 65 # Also add CTF data to the debug kernel 66 if [ -z "${INFILE##bsd.gdb}" ]; then 67 objcopy --add-section .SUNW_ctf=${TMPFILE} "${INFILE}" 68 fi 69else 70 strip ${STRIPFLAG} ${OUTFILE:+"-o${OUTFILE}"} "${INFILE}" 71fi 72 73rm -f ${TMPFILE} 74