Boot framework rework (#45)
[lunaix-os.git] / lunaix-os / scripts / gen-ksymtable
1 #!/usr/bin/env bash
2
3 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
4
5 sym_types=$1
6 bin=$2
7
8 nm_out=$(nm -nfbsd "$bin")
9 class_info=$($SCRIPT_DIR/elftool.tool -t -i $bin)
10
11 allsyms=($nm_out)
12 allsyms_len=${#allsyms[@]}
13
14 dtype="4byte"
15 if [ "$class_info" == 'ELF64' ]; then
16     dtype="8byte"
17 fi
18
19 syms_idx=()
20
21 for (( i=0; i<allsyms_len; i+=3));
22 do
23     type=${allsyms[$i + 1]}
24
25     if [[ "$sym_types" == *"$type"* ]]; then
26         syms_idx+=($i)
27     fi
28 done
29
30 syms_len=${#syms_idx[@]}
31 declare -A assoc_array
32
33 echo '.section .autogen.ksymtable, "a", @progbits'
34 echo "    .global __autogen_ksymtable"
35 echo "    __autogen_ksymtable:"
36 echo "        .$dtype $syms_len"
37 echo "        .align 8"
38
39 for i in "${syms_idx[@]}"
40 do
41     addr=${allsyms[$i]}
42     type=${allsyms[$i + 1]}
43     sym=${allsyms[$i + 2]}
44
45     cat <<EOF
46         .$dtype 0x$addr
47         .$dtype __S$sym
48         .align 8
49
50 EOF
51     assoc_array["$sym"]=1
52 done
53
54 for sym_str in "${!assoc_array[@]}"
55 do
56     cat <<EOF
57     __S$sym_str:
58         .asciz "$sym_str"
59         .align 8
60 EOF
61 done