go 语言交叉编译后无法运行
最近又重新做一个 go 项目,但是我本地是 mac ,放阿里云 linux 还是没法运行,这是我很早以前在 sf 上的一个提问:go build 之后的文件放服务器上不能运行,cpu 不同导致?,当时通过 docker 打包在容器里去运行,但是没人解释出根本的原因。
编译命令:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o test main.go
编译的代码也很简单:
func main() {
fmt.Println("hello world")
}
gdb 运行编译出来的程序, 看看是为什么不能运行
盲猜是因为 CentOS7 的内核太老了
可以把复现代码放在 GitHub 上一份吗? go build 可以通过指定文件,也可以指定 package 。我不知道它们之间究竟有没有区别,但我用的一直都是 package 的方式,例如:
go build -o bin/api src/api_gateway
各个组件的版本号贴一下,我 Google 到一个 issue ,那边好像判断下来是 CPU 太老了,编译的时候使用了新的指令集,造成不兼容
macOS 、Aliyun 、Google Cloud 的 go env 、uname -a 。如果方便的话,sysctl 也可以贴一下,比如 sysctl -a | grep 'machdep.cpu'
忘了贴链接 github.com/golang/go/issues/42503
用这个试试:
CGO_ENABLED=0 go build -o test -a -ldflags '-extldflags "-static"' .
估计 CPU 版本问题. amd64 指令集有不同的版本, 最基础的是基线版本 baseline, 后面还有 v2, v3, v4... 理论上现在你能用到的所有 amd64 cpu 都支持基线版本的指令集, 但是不一定会支持更高版本的指令集(如果你的 CPU 太旧的话). 你在 mac 进行交叉编译, 只告诉了编译器目标操作系统和目标架构, 却没有告诉它目标架构的版本, 那么它很可能用了更高版本的指令.
github.com/golang/go/issues/50589
可以看下是不是依赖库有问题
goarch 改成 386 试试
ldd 在服务器上看下
powershell: $Env:GOOS="linux"
powershell: go build
我的机子 win10 64bit , cpu ryzen 2600, 交叉编译很多年,一直没有问题。
线上的 ubuntu 14 ,我没管理员权限,找运维帮我运行的, 输出是 Segmentation fault (core dumped)
就是个 hello world 程序,以前知道有这个问题,所以这次 go 17.2 版本再试试,结果还是不能运行。阿里云上面的机器没有装 go 开发环境,就是单纯的 ubuntu 14 。 正式开发我们还是有单独的 linux 机器去做编译部署。感谢你提供的链接。
嗯,以前运行不成功我也猜测可能和 CPU 有关,不过太底层的知识我不了解。阿里的服务器应该不会老吧,我的 mac 电脑倒是 13 年款的 :doge
env GOPROXY= goproxy.cn GOOS=linux GOARCH=amd64 go build
Ubuntu 14 太老了,glibc 版本都不知道多少年前的
我放我虚拟机里的 linux 运行也没问题,就是放云服务器上运行不成功。我记得之前在 google vm 上的是 intel xeon cpu ,没体验过这种 u
go 程序关了 cgo 是不会调 libc 的
那估计是内核版本太老,Go 的有些系统调用在旧内核无法正常工作
通过什么协议把二进制文件传到服务器上的?有 FTP 吗
2.6 老内核 Go 的系统调用不一样,你用老版本的 Go 试试看(比如 1.6 ),如果可以运行可能就是这个原因。
github.com/golang/go/wiki/MinimumRequirements
我碰到过非常老的 linux 不能运行交叉编译的文件,印象是依赖库问题。
不过项目本身会有韵味那边在线上环境再次编译才会上线,运行没问题,所以没在研究。
试试老版本的 go
以前我在新系统里非交叉编译的拿到 centos5 上不能运行,查了一下因为 kernel API 变动而不兼容,于是降级 go 版本搞定
楼主,之前碰到过类似问题,参见
接楼上, 连接: sakishum.com/2021/11/29/Golang-%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91%E6%8A%A5%E9%94%99-XX-is-invalid-in-C99/#/%E5%AE%89%E8%A3%85musl
嗯,FTP 传的
感谢提供的链接
缺少静态编译参数
是不是用 ascii mode 传的,换成 binary mode 上传试试
我擦,结案了,可以运行了,还真是 FTP 的鬼,我用的 FileZilla ,设置里如果传的文件没有扩展自动转 ascii ,所以文件被损坏了。我怎么也没想到是它是它是它 :doge
你…… hash 都不对比一下的?
听说体验有超越 vscode 的趋势,不知真假。主要写写 js py golang ,以脚本为主,偶尔写写 Web 项目,有没有实践过的老哥说说,还有在 wsl2 ,iterm…
大龄 iOS 正在转 Java ,学习 Java 中,但是看到很多工作多年 35 岁的 Java 也找不到工作,我迷茫了,请教各位怎么办 看了大家的评论还是迷茫,要不要坚持转…
转载于酷壳CoolShell 无删改 仅以此纪念陈皓(左耳朵耗子)…
合速度