1#!/bin/sh
2
3makealias ()
4{
5
6	printf "\n" >> ${OUTPUT}
7	printf "__weak_alias(%s,_stubnosys);\n" $1 >> ${OUTPUT}
8	printf "__weak_alias(_%s,_stubnosys);\n" $1 >> ${OUTPUT}
9	printf "__strong_alias(_sys_%s,_stubnosys);\n" $1 >> ${OUTPUT}
10}
11
12[ $# -eq 4 ] || { echo invalid usage; exit 1;}
13
14NM=$1
15RUMPSRC=$2
16BASELIB=$3
17OUTPUT=$4
18
19rm -f ${OUTPUT}
20printf '/* AUTOMATICALLY GENERATED */\n\n' >> ${OUTPUT}
21printf '#include <sys/cdefs.h>\n\n' >> ${OUTPUT}
22printf 'extern int main(int, char**);\n' >> ${OUTPUT}
23printf 'int _want_main(void); int _want_main(void) {return main(0, 0);}\n' \
24    >> ${OUTPUT}
25printf 'int _stubnosys(void); int _stubnosys(void) {return -1;}\n' \
26    >> ${OUTPUT}
27
28# special cases
29printf "__strong_alias(rump_syscall,_stubnosys);\n" >> ${OUTPUT}
30printf "__strong_alias(_start,_stubnosys);\n\n" >> ${OUTPUT}
31
32# symbols not convered by libc
33${NM} -o -g --defined-only ${BASELIB} | awk '
34$(NF-1) == "T" {
35	printf("__strong_alias(%s,_stubnosys);\n", $NF);
36	next
37}
38$(NF-1) == "W" {
39	printf("__weak_alias(%s,_stubnosys);\n", $NF);
40	next
41}
42$(NF-1) ~ "(D|C)" {
43	printf("int %s;\n", $NF);
44	next
45}
46{
47	printf("error, symbol type %s not handled\n", $(NF-1)) | "cat 1>&2";
48	exit(1)
49}
50' >> ${OUTPUT} || exit 1
51
52# system calls
53awk '{print $3}' < ${RUMPSRC}/sys/rump/rump.sysmap | while read syscall; do
54	makealias ${syscall}
55done
56
57exit 0
58