xref: /openbsd-src/usr.bin/ctfconv/ctfstrip (revision fa44dea1c190af0c767b553d0d7b503256b4b660)
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