Go编译报错:调用(_C2func_bcc_func_load)参数不足,求解决方案
解决Go编译时
not enough arguments in call to (_C2func_bcc_func_load)错误 这个错误是因为你使用的github.com/iovisor/gobpf@v0.2.0版本与系统安装的libbcc库版本不匹配导致的。bcc_func_load函数的签名在不同libbcc版本中发生了变更,旧版本的gobpf绑定未适配新版本的参数要求,导致调用时参数数量不足。
下面是几种可行的解决方法:
升级gobpf到兼容版本
执行以下命令将gobpf更新至最新版(或适配当前libbcc的版本):go get github.com/iovisor/gobpf@latest更新完成后重新编译代码,新版本的gobpf已适配libbcc的函数签名变化。
降级系统中的libbcc库
若无法升级gobpf,可以将系统中的libbcc库降级到与gobpf v0.2.0兼容的版本。不同系统的操作方式略有差异:- Debian/Ubuntu:查找对应版本的deb包进行安装
- RHEL/CentOS:使用yum安装指定版本的libbcc包
手动修改gobpf源码适配(临时方案)
若需要保留当前gobpf版本,可手动修改module.go中函数调用的参数:
打开文件/home/jeremy/go/pkg/mod/github.com/iovisor/gobpf@v0.2.0/bcc/module.go,定位到第230行,补充缺失的两个参数(*_Ctype_char和_Ctype_int),示例修改如下:// 原调用 _C2func_bcc_func_load(unsafe.Pointer(fd), _Ctype_int(BPF_PROG_TYPE_SOCKET_FILTER), name, insns, _Ctype_int(len(insns)), license, _Ctype_uint(0), _Ctype_int(0), "", _Ctype_uint(0), nil) // 修改后 _C2func_bcc_func_load(unsafe.Pointer(fd), _Ctype_int(BPF_PROG_TYPE_SOCKET_FILTER), name, insns, _Ctype_int(len(insns)), license, _Ctype_uint(0), _Ctype_int(0), "", _Ctype_uint(0), nil, _Ctype_int(0))注意:此方法属于临时hack,后续更新依赖会覆盖修改,优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者Jeremy Chong
相关产品推荐
相关产品推荐

