xref: /aosp_15_r20/external/libcap/contrib/bug216610/package_fns.sh (revision 2810ac1b38eead2603277920c78344c84ddf3aff)
1#!/bin/bash
2#
3# Generate some Go code to make calling into the C code of the .syso
4# file easier.
5
6package="${1}"
7syso="${2}"
8
9if [[ -z "${syso}" ]]; then
10    echo "usage: $0 <package> <.....syso>" >&2
11    exit 1
12fi
13
14if [[ "${syso%.syso}" == "${syso}" ]]; then
15    echo "2nd argument should be a .syso file" >&2
16    exit 1
17fi
18
19cat<<EOF
20package ${package}
21
22import (
23	"unsafe"
24)
25
26// syso is how we call, indirectly, into the C-code.
27func syso(cFn, state unsafe.Pointer)
28
29type sysoCaller struct {
30	ptr unsafe.Pointer
31}
32
33// call calls the syso linked C-function, $sym().
34func (s *sysoCaller) call(data unsafe.Pointer) {
35	syso(s.ptr, data)
36}
37EOF
38
39for sym in $(objdump -x "${syso}" | grep -F 'g     F' | awk '{print $6}'); do
40    cat<<EOF
41
42//go:linkname _${sym} ${sym}
43var _${sym} byte
44var syso__${sym} = &sysoCaller{ptr: unsafe.Pointer(&_${sym})}
45
46EOF
47done
48