golang plugin mac 平台下生成 .so 文件,放到 Linux 下执行时报错

2020 年 11 月 29 日
 TOUJOURSER

我想在 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

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

4096 次点击
所在节点    Go 编程语言
19 条回复
CismonX
2020 年 11 月 29 日
因为 macOS 下生成的可执行文件是 Mach-O 格式,而不是 ELF 格式
CismonX
2020 年 11 月 29 日
啊,不好意思,没有看清问题内容,无视我的回答
rammiah
2020 年 11 月 29 日
file 看一下格式对不对
TOUJOURSER
2020 年 11 月 29 日
@CismonX 上面加了补充,请问 mac 下如何 go build 生成 ELF 格式
TOUJOURSER
2020 年 11 月 29 日
@yianing 大佬,上面加了补充
nightwitch
2020 年 11 月 29 日
feast
2020 年 11 月 29 日
ARCH= OS= 你宏都不定义 跨平台编译个啥?
reus
2020 年 11 月 29 日
你如果真的用了 export CGO_ENABLED=0 GOOS=linux GOARCH=amd64
那编译出来的不会是 Mach-O 文件
而且就算你正确用了,也还是需要 gcc/clang 工具链的,相当麻烦,还是找个 linux 机器吧
12101111
2020 年 11 月 29 日
@reus CGO_ENABLED=0 是不需要 gcc/clang 的
reus
2020 年 11 月 29 日
raaaaaar
2020 年 11 月 29 日
推荐直接在目标平台下编译
TypeError
2020 年 11 月 29 日
我也感觉交叉编译很麻烦,不过 Windows 的 wsl 真爽,直接在 Linux 下编译
cmostuor
2020 年 11 月 29 日
谷歌的 golang 团队是时候把 go 写成和 java 一样 加个 gvm 一次编译到处运行
mrowng123
2020 年 11 月 29 日
最简单的是用 docker 编译,一身轻松。不用担心交叉编译的问题。
Jirajine
2020 年 11 月 29 日
go 对交叉编译支持还算比较好的了,最简单的办法还是直接用目标架构 /系统的虚拟机或在线的 CI/CD 编译。
hahasong
2020 年 11 月 30 日
别信 go 的交叉编译,就算能跑,二进制大小也比 Linux 下直接编译的大,经常有莫名的问题
abersheeran
2020 年 11 月 30 日
用 Docker 拉一个最小镜像编译去
q569321245
2021 年 4 月 15 日
```
我现在也遇到这样的问题 请问下当时你是怎么解决的
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -buildmode=plugin -o=release.so main.go

# command-line-arguments
/usr/local/go/pkg/tool/darwin_amd64/link: running clang failed: exit status 1
ld: unknown option: -z
clang: error: linker command failed with exit code 1 (use -v to see invocation)

```
TOUJOURSER
2021 年 4 月 17 日
@q569321245 没解决,后来用的 docker 镜像去编译的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/730259

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX