我想在 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
大佬们有没有遇到过类似的问题,求解答
1
CismonX 2020-11-29 11:22:45 +08:00 via iPhone
因为 macOS 下生成的可执行文件是 Mach-O 格式,而不是 ELF 格式
|
2
CismonX 2020-11-29 11:26:08 +08:00 via iPhone
啊,不好意思,没有看清问题内容,无视我的回答
|
3
yianing 2020-11-29 11:27:41 +08:00 via Android
file 看一下格式对不对
|
4
TOUJOURSER OP @CismonX 上面加了补充,请问 mac 下如何 go build 生成 ELF 格式
|
5
TOUJOURSER OP @yianing 大佬,上面加了补充
|
6
nightwitch 2020-11-29 13:06:06 +08:00
|
7
feast 2020-11-29 13:14:24 +08:00
ARCH= OS= 你宏都不定义 跨平台编译个啥?
|
8
reus 2020-11-29 13:32:56 +08:00
你如果真的用了 export CGO_ENABLED=0 GOOS=linux GOARCH=amd64
那编译出来的不会是 Mach-O 文件 而且就算你正确用了,也还是需要 gcc/clang 工具链的,相当麻烦,还是找个 linux 机器吧 |
10
reus 2020-11-29 13:36:06 +08:00
@12101111 https://github.com/golang/go/issues/19569 但 plugin 需要 cgo 。
|
11
raaaaaar 2020-11-29 13:43:10 +08:00 via Android
推荐直接在目标平台下编译
|
12
TypeError 2020-11-29 14:06:36 +08:00 via Android
我也感觉交叉编译很麻烦,不过 Windows 的 wsl 真爽,直接在 Linux 下编译
|
13
cmostuor 2020-11-29 14:14:23 +08:00
谷歌的 golang 团队是时候把 go 写成和 java 一样 加个 gvm 一次编译到处运行
|
14
mrowng123 2020-11-29 16:58:07 +08:00
最简单的是用 docker 编译,一身轻松。不用担心交叉编译的问题。
|
15
Jirajine 2020-11-29 17:01:16 +08:00 via Android
go 对交叉编译支持还算比较好的了,最简单的办法还是直接用目标架构 /系统的虚拟机或在线的 CI/CD 编译。
|
16
hahasong 2020-11-30 09:32:43 +08:00 via iPhone
别信 go 的交叉编译,就算能跑,二进制大小也比 Linux 下直接编译的大,经常有莫名的问题
|
17
abersheeran 2020-11-30 09:42:10 +08:00
用 Docker 拉一个最小镜像编译去
|
18
q569321245 2021-04-15 17:53:58 +08:00
```
我现在也遇到这样的问题 请问下当时你是怎么解决的 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) ``` |
19
TOUJOURSER OP @q569321245 没解决,后来用的 docker 镜像去编译的
|