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