111497Sphk:
211497Sphk#
311497Sphk# ----------------------------------------------------------------------------
411497Sphk# "THE BEER-WARE LICENSE" (Revision 42):
593151Sphk# <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
611497Sphk# can do whatever you want with this stuff. If we meet some day, and you think
711497Sphk# this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
811497Sphk# ----------------------------------------------------------------------------
911497Sphk#
10108605Sphk# Sort options by "Matthew Emmerton" <matt@gsicomp.on.ca>
11108605Sphk#
1250477Speter# $FreeBSD$
1311497Sphk#
14108605Sphk# This shell script will make a cross reference of the symbols of a kernel.
15108605Sphk#
1611497Sphk
17103392SphkCOMPILEDIR=/sys/`uname -m`/compile
1841594SarchieKERNELNAME=LINT
19108605SphkSORTORDER=-k1
2041594Sarchie
21108605Sphkargs=`getopt h?k:s: $*`;
22108605Sphkif [ $? != 0 ]
23108605Sphkthen
24108605Sphk	args="-h";
25103392Sphkfi
26108605Sphkset -- $args;
27108605Sphkfor i
28108605Sphkdo
29108605Sphk	case "$i"
30108605Sphk	in
31108605Sphk	-h|-\?)
32108605Sphk		echo "Usage: $0 [ -k <kernelname> ] [ -s [ 'symbol' | 'filename' ] ]";
33108605Sphk		exit 0;
34108605Sphk		;;
35108605Sphk	-k)
36108605Sphk		KERNELNAME=$2
37108605Sphk		if [ -d ${COMPILEDIR}/${KERNELNAME} ];
38108605Sphk		then
39108605Sphk			shift; shift;
40108605Sphk			continue;
41108605Sphk		fi
42108605Sphk		echo "Kernel '$KERNELNAME' does not exist in ${COMPILEDIR}!";
43108605Sphk		exit 1;
44108605Sphk		;;
45108605Sphk	-s)
46108605Sphk		if [ "x$2" = "xsymbol" ]
47108605Sphk		then
48108605Sphk			SORTORDER=-k1
49108605Sphk			shift; shift;
50108605Sphk			continue;
51108605Sphk		fi
52108605Sphk		if [ "x$2" = "xfilename" ]
53108605Sphk		then
54108605Sphk			SORTORDER=-k2
55108605Sphk			shift; shift;
56108605Sphk			continue;
57108605Sphk		fi
58108605Sphk		echo "Invalid selection for -s: $2";
59108605Sphk		exit 1;
60108605Sphk		;;
61108605Sphk	--)
62108605Sphk		shift;
63108605Sphk		break;
64108605Sphk		;;
65108605Sphk	esac
66108605Sphkdone
67103392Sphk
6841594Sarchiecd ${COMPILEDIR}/${KERNELNAME}
6941594Sarchie
70141640SphkMOD_OBJS=`find modules -name \*.o`
71103392Sphk
72141640Sphkfor i in *.o $MOD_OBJS
73141640Sphkdo
74141640Sphk	nm -gon $i
75141640Sphkdone | sed '
76141640Sphk/aicasm.*:/d
77141640Sphk/genassym.*:/d
78141640Sphks/.*\///
79141640Sphks/:/ /
80141640Sphk' |  awk '
8111497SphkNF > 1	{
8211497Sphk	if ($2 == "t") 
8311497Sphk		next
8411497Sphk	if ($2 == "F")
8511497Sphk		next
8611497Sphk	if ($2 == "U") {
8711497Sphk		ref[$3]=ref[$3]" "$1
88141640Sphk		nm[$3]++
89141640Sphk	} else if ($3 == "D" || $3 == "T" || $3 == "B" || $3 == "R" || $3 == "A") {
90141640Sphk		if (def[$4] != "")
91141640Sphk			def[$4]=def[$4]" "$1
9211497Sphk		else
93141640Sphk			def[$4]=$1
94141640Sphk		nm[$4]++
9511497Sphk	} else if ($2 == "?") {
9611497Sphk		if (def[$3] == "S")
9711497Sphk			i++
9811497Sphk		else if (def[$3] != "")
9911497Sphk			def[$3]=def[$3]",S"
10011497Sphk		else
10111497Sphk			def[$3]="S"
10211497Sphk		ref[$3]=ref[$3]" "$1
103141640Sphk		nm[$3]++
10411497Sphk	} else if ($2 == "C") {
10511497Sphk		if (def[$3] == $2)
10611497Sphk			i++
10712814Sphk		else if (def[$3] == "")
10812814Sphk			def[$3]=$1
10911497Sphk		else
11012814Sphk			ref[$3]=ref[$3]" "$1
111141640Sphk		nm[$3]++
11211497Sphk	} else {
11311497Sphk		print ">>>",$0
11411497Sphk	}
11511497Sphk	}
11611497SphkEND	{
11711497Sphk	for (i in nm) {
11811497Sphk		printf "%s {%s} %s\n",i,def[i],ref[i]
11911497Sphk	}
12011497Sphk	}
121108605Sphk' | sort $SORTORDER | awk '
12211497Sphk	{
12311497Sphk	if ($2 == "{S}")
12411497Sphk		$2 = "<Linker set>"
12511497Sphk	if (length($3) == 0) {
126141640Sphk		printf "%-31s %d %s\tUNREF\n",$1,0, $2
12712870Sphk		N1++
12811497Sphk	} else if ($2 == "{}") {
129141640Sphk		printf "%-31s %d {UNDEF}\n",$1, NF-2
13012870Sphk		N2++
13111497Sphk	} else {
132141640Sphk		printf "%-31s %d %s",$1,NF-2,$2
13312870Sphk		p = 80;
13412870Sphk		for (i = 3 ; i <= NF; i++) {
135141640Sphk			if (p+length ($i)+1 > 48) {
136141640Sphk				printf "\n\t\t\t\t\t%s", $i
13712870Sphk				p = 7;
13812870Sphk			} else {
13912870Sphk				printf " %s", $i
14012870Sphk			}
14112870Sphk			p += 1 + length ($i)
14212870Sphk		}
14312870Sphk		printf "\n"
14412870Sphk		N3++
14512870Sphk		if (NF-2 == 1) 
14612870Sphk			N4++
14712870Sphk		if (NF-2 == 2)
14812870Sphk			N5++
14911497Sphk	}
15011497Sphk	}
15112870SphkEND	{
15212870Sphk	printf "Total symbols: %5d\n",N1+N2+N3
15312875Sbde	printf "unref symbols: %5d\n",N1
15412875Sbde	printf "undef symbols: %5d\n",N2
15512870Sphk	printf "1 ref symbols: %5d\n",N4
15612870Sphk	printf "2 ref symbols: %5d\n",N5
15712870Sphk	}
15811497Sphk'
159