8676
|
1 #!/bin/bash
|
|
2
|
|
3 export LANG=C
|
|
4
|
|
5 set -e
|
|
6
|
|
7 if [ $# -lt 1 ]; then
|
|
8 echo "Usage: PROGNAME=foo LICENSE=bar $0 <bpf object file>"
|
|
9 exit 1
|
|
10 fi
|
|
11
|
|
12
|
|
13 self=$0
|
|
14 filename=$1
|
|
15 funcname=$PROGNAME
|
|
16
|
|
17 generate_head()
|
|
18 {
|
|
19 cat << END
|
|
20 /* AUTO-GENERATED, DO NOT EDIT. */
|
|
21
|
|
22 #include <stddef.h>
|
|
23 #include <stdint.h>
|
|
24
|
|
25 #include "ngx_bpf.h"
|
|
26
|
|
27
|
|
28 END
|
|
29 }
|
|
30
|
|
31 generate_tail()
|
|
32 {
|
|
33 cat << END
|
|
34
|
|
35 ngx_bpf_program_t $PROGNAME = {
|
|
36 .relocs = bpf_reloc_prog_$funcname,
|
|
37 .nrelocs = sizeof(bpf_reloc_prog_$funcname)
|
|
38 / sizeof(bpf_reloc_prog_$funcname[0]),
|
|
39 .ins = bpf_insn_prog_$funcname,
|
|
40 .nins = sizeof(bpf_insn_prog_$funcname)
|
|
41 / sizeof(bpf_insn_prog_$funcname[0]),
|
|
42 .license = "$LICENSE",
|
|
43 .type = BPF_PROG_TYPE_SK_REUSEPORT,
|
|
44 };
|
|
45
|
|
46 END
|
|
47 }
|
|
48
|
|
49 process_relocations()
|
|
50 {
|
|
51 echo "static ngx_bpf_reloc_t bpf_reloc_prog_$funcname[] = {"
|
|
52
|
|
53 objdump -r $filename | awk '{
|
|
54
|
|
55 if (enabled && $NF > 0) {
|
|
56 off = strtonum(sprintf("0x%s", $1));
|
|
57 name = $3;
|
|
58
|
|
59 printf(" { \"%s\", %d },\n", name, off/8);
|
|
60 }
|
|
61
|
|
62 if ($1 == "OFFSET") {
|
|
63 enabled=1;
|
|
64 }
|
|
65 }'
|
|
66 echo "};"
|
|
67 echo
|
|
68 }
|
|
69
|
|
70 process_section()
|
|
71 {
|
|
72 echo "static struct bpf_insn bpf_insn_prog_$funcname[] = {"
|
|
73 echo " /* opcode dst src offset imm */"
|
|
74
|
|
75 section_info=$(objdump -h $filename --section=$funcname | grep "1 $funcname")
|
|
76
|
|
77 # dd doesn't know hex
|
|
78 length=$(printf "%d" 0x$(echo $section_info | cut -d ' ' -f3))
|
|
79 offset=$(printf "%d" 0x$(echo $section_info | cut -d ' ' -f6))
|
|
80
|
|
81 for ins in $(dd if="$filename" bs=1 count=$length skip=$offset status=none | xxd -p -c 8)
|
|
82 do
|
|
83 opcode=0x${ins:0:2}
|
|
84 srcdst=0x${ins:2:2}
|
|
85
|
|
86 # bytes are dumped in LE order
|
|
87 offset=0x${ins:6:2}${ins:4:2} # short
|
|
88 immedi=0x${ins:14:2}${ins:12:2}${ins:10:2}${ins:8:2} # int
|
|
89
|
|
90 dst="$(($srcdst & 0xF))"
|
|
91 src="$(($srcdst & 0xF0))"
|
|
92 src="$(($src >> 4))"
|
|
93
|
|
94 opcode=$(printf "0x%x" $opcode)
|
|
95 dst=$(printf "BPF_REG_%d" $dst)
|
|
96 src=$(printf "BPF_REG_%d" $src)
|
|
97 offset=$(printf "%d" $offset)
|
|
98 immedi=$(printf "0x%x" $immedi)
|
|
99
|
|
100 printf " { %4s, %11s, %11s, (int16_t) %6s, %10s },\n" $opcode $dst $src $offset $immedi
|
|
101 done
|
|
102
|
|
103 cat << END
|
|
104 };
|
|
105
|
|
106 END
|
|
107 }
|
|
108
|
|
109 generate_head
|
|
110 process_relocations
|
|
111 process_section
|
|
112 generate_tail
|
|
113
|