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