国标GB28181协议云边端视频智能分析平台EasyGBS针对aarch64编译报undefined:syscall.Dup2解决方法

由于很多用户的系统和程序都不同,因此TSINGSEE青犀视频研发团队往往需要根据用户的实际需求来对产品进行定制或者修改。国标EasyGBS视频智能分析平台曾经在aarch64上重新编译过,近期我们又遇到用户有这样的需求,才发现原来有类似需求的用户还是挺多的。

在aarch64环境下编译EasyGBS过程中,出现报错:undefined:syscall.Dup2

为了排查这一问题,我们在X64上的Centos6.5系统上编译出其他平台的可执行程序,查看下Golang支持的平台,得知支持linux/arm64

随后我们尝试了采用cgo的交叉编译,使用cgo,就必须指定CGO_ENABLE=1。并且必须指定CC参数为对应架构的gcc的交叉编译器。现在编译64位ARM平台的程序,需要aarch64版本的交叉编译工具。

但是在编译ARM版本的代码时,又出现报错——系统调用找不到的问题。

对比golang源码实现:go/src/syscall/zsyscall_linux_amd64.go和go/src/syscall/zsyscall_linux_arm64.go,发现arm平台未实现Dup2但是提供了Dup3.如下图所示

Dup3与Dup2参数略有差异,dup(int filedes)函数返回一个可用的与filedes共享文件表项的最小描述符。而dup2(int filedes,int filedes2)是使用一个描述符filedes2去指向filedes2文件表项(也是共享),但是在调用dup2之前要确保filedes2为可用描述符。

解决办法是修改调用的地方:

增加对编译参数的判断,如果 runtime.GOARCH == “arm64”
表示aarch64位编译, 调用Dup3.编译通过。

当然了,TSINGSEE青犀视频研发团队也会将其他视频智能分析平台编译不同的版本,如果大家有需求或者有兴趣,欢迎联系我们了解。

posted on 2020-11-27 18:08  EasyGBS  阅读(365)  评论(0编辑  收藏  举报