Golang Go语言在mac平台下生成的.so文件,放到Linux下执行时报错

发布于 1周前 作者 h691938207 来自 Go语言

Golang Go语言在mac平台下生成的.so文件,放到Linux下执行时报错

我想在 mac 环境生成可以在 Linux 上运行的.so 文件:

export CGO_ENABLED=0 GOOS=linux GOARCH=amd64
go build -buildmode=plugin -o xxx.so xxx.go

但是在 linux 下运行是报错:

plugin.Open("xxx.so"): xxx.so: invalid ELF header

大佬们有没有遇到过类似的问题,求解答


更多关于Golang Go语言在mac平台下生成的.so文件,放到Linux下执行时报错的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

20 回复

因为 macOS 下生成的可执行文件是 Mach-O 格式,而不是 ELF 格式

更多关于Golang Go语言在mac平台下生成的.so文件,放到Linux下执行时报错的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


啊,不好意思,没有看清问题内容,无视我的回答

file 看一下格式对不对

上面加了补充,请问 mac 下如何 go build 生成 ELF 格式

大佬,上面加了补充

ARCH= OS= 你宏都不定义 跨平台编译个啥?

你如果真的用了 export CGO_ENABLED=0 GOOS=linux GOARCH=amd64
那编译出来的不会是 Mach-O 文件
而且就算你正确用了,也还是需要 gcc/clang 工具链的,相当麻烦,还是找个 linux 机器吧

CGO_ENABLED=0 是不需要 gcc/clang 的

推荐直接在目标平台下编译

我也感觉交叉编译很麻烦,不过 Windows 的 wsl 真爽,直接在 Linux 下编译

谷歌的 golang 团队是时候把 go 写成和 java 一样 加个 gvm 一次编译到处运行

最简单的是用 docker 编译,一身轻松。不用担心交叉编译的问题。

go 对交叉编译支持还算比较好的了,最简单的办法还是直接用目标架构 /系统的虚拟机或在线的 CI/CD 编译。

别信 go 的交叉编译,就算能跑,二进制大小也比 Linux 下直接编译的大,经常有莫名的问题

用 Docker 拉一个最小镜像编译去

<br>我现在也遇到这样的问题 请问下当时你是怎么解决的<br>CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -buildmode=plugin -o=<a target="_blank" href="http://release.so" rel="nofollow noopener">release.so</a> main.go<br><br># command-line-arguments<br>/usr/local/go/pkg/tool/darwin_amd64/link: running clang failed: exit status 1<br>ld: unknown option: -z<br>clang: error: linker command failed with exit code 1 (use -v to see invocation)<br><br>

没解决,后来用的 docker 镜像去编译的

在Mac平台下生成的Go语言 .so 动态链接库文件在Linux下执行时报错,通常是由于以下几个原因导致的:

  1. 平台差异:Go语言编译时会根据目标平台生成相应的二进制文件。Mac和Linux底层系统架构(如系统调用、库文件等)存在差异,因此直接在Linux上运行Mac编译的 .so 文件会导致不兼容。

  2. CGO依赖:如果你的Go代码中使用了CGO来调用C语言代码或系统库,这些库在不同平台上的实现可能不同,或者某些库在Linux上根本不存在。

  3. 编译器标志:编译 .so 文件时使用的编译器标志(如 -ldflags)可能影响了跨平台兼容性。

解决方案:

  • 交叉编译:在Mac上使用Go的交叉编译功能来生成适用于Linux的 .so 文件。可以通过设置环境变量 GOOSGOARCH 来实现,例如 GOOS=linux GOARCH=amd64 go build -buildmode=c-shared -o libexample.so example.go

  • 检查CGO代码:确保CGO调用的C代码或库在Linux上可用,并考虑使用条件编译来处理平台特定的代码。

  • 测试与验证:在Linux环境下进行充分的测试,确保生成的 .so 文件能正确加载和执行。

通过上述方法,你应该能够解决在Linux下执行Mac编译的 .so 文件时遇到的问题。

回到顶部