V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
TOUJOURSER
V2EX  ›  Go 编程语言

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

  •  
  •   TOUJOURSER · 2020-11-29 11:04:12 +08:00 · 3420 次点击
    这是一个创建于 1448 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想在 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 条附言  ·  2020-11-29 12:39:27 +08:00
    ```
    $ file xxx_linux.so # 这是 linux 生成的.so 文件
    ping_linux.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=8eef12754e3ad8168d0355effba67bb5e685f6d6, not stripped

    $ file xxx_mac.so # 这是 mac 生成的.so 文件
    ping_mac.so: Mach-O 64-bit dynamically linked shared library

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

    ```
    TOUJOURSER
        19
    TOUJOURSER  
    OP
       2021-04-17 14:00:55 +08:00
    @q569321245 没解决,后来用的 docker 镜像去编译的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2870 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 03:46 · PVG 11:46 · LAX 19:46 · JFK 22:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.