aboutsummaryrefslogtreecommitdiff
path: root/contrib/bug216610/package_fns.sh
blob: 0f4b91ce66f6e5e9b415003330a1f63682f04ba9 (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
#!/bin/bash
#
# Generate some Go code to make calling into the C code of the .syso
# file easier.

package="${1}"
syso="${2}"

if [[ -z "${syso}" ]]; then
    echo "usage: $0 <package> <.....syso>" >&2
    exit 1
fi

if [[ "${syso%.syso}" == "${syso}" ]]; then
    echo "2nd argument should be a .syso file" >&2
    exit 1
fi

cat<<EOF
package ${package}

import (
	"unsafe"
)

// syso is how we call, indirectly, into the C-code.
func syso(cFn, state unsafe.Pointer)

type sysoCaller struct {
	ptr unsafe.Pointer
}

// call calls the syso linked C-function, $sym().
func (s *sysoCaller) call(data unsafe.Pointer) {
	syso(s.ptr, data)
}
EOF

for sym in $(objdump -x "${syso}" | grep -F 'g     F' | awk '{print $6}'); do
    cat<<EOF

//go:linkname _${sym} ${sym}
var _${sym} byte
var syso__${sym} = &sysoCaller{ptr: unsafe.Pointer(&_${sym})}

EOF
done