summaryrefslogtreecommitdiff
path: root/sys/conf/mkldscript.sh
blob: 6d62ddf288e714c02cca1831ac6366f51214655a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/sh
#	$NetBSD: mkldscript.sh,v 1.3 2014/11/12 13:23:41 christos Exp $
#
#	This script is used by cats, luna68k and shark to produce
#	a kernel linker script that merges link sets for a.out kernels
#	(without -t). It is also used for the same reason by kernel modules
#	(with -t).

PROG="$(basename "$0")"
TEMPLATE=

mksets() {
    "${OBJDUMP:-objdump}" -x "$@" | fgrep "RELOCATION RECORDS FOR [link_set" | \
        sort -u | sed 's/^.*\[\(.*\)\]:$/\1/'
}

while getopts "t:" f; do
	case "$f" in
	t)
		TEMPLATE=${OPTARG};;
	*)
		echo "Usage: $PROG [-t <template>] objs" 1>^&2
		exit 1;;
	esac
done

shift $((OPTIND - 1))

SETS=$(mksets "$@")

if [ -n "${TEMPLATE}" ]; then
	grep -v '^}$' "${TEMPLATE}"
fi

for s in $SETS; do
        printf '   . = ALIGN(4);\n'
        printf '   PROVIDE (__start_%s = .);\n' $s
	if [ -n "${TEMPLATE}" ]; then
		printf '   %s : { *(%s) }\n' $s $s
	else
		printf '   *(%s)\n' $s
	fi
        printf '   PROVIDE (__stop_%s = .);\n' $s
done

if [ -n "${TEMPLATE}" ]; then
	printf '}\n'
fi