V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
TOUJOURSER

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

  •  
  •   TOUJOURSER · Nov 29, 2020 · 4096 views
    This topic created in 1979 days ago, the information mentioned may be changed or developed.

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

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

    Supplement 1  ·  Nov 29, 2020
    ```
    $ 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 replies    2021-04-17 14:00:55 +08:00
    CismonX
        1
    CismonX  
       Nov 29, 2020 via iPhone
    因为 macOS 下生成的可执行文件是 Mach-O 格式,而不是 ELF 格式
    CismonX
        2
    CismonX  
       Nov 29, 2020 via iPhone
    啊,不好意思,没有看清问题内容,无视我的回答
    rammiah
        3
    rammiah  
       Nov 29, 2020 via Android
    file 看一下格式对不对
    TOUJOURSER
        4
    TOUJOURSER  
    OP
       Nov 29, 2020
    @CismonX 上面加了补充,请问 mac 下如何 go build 生成 ELF 格式
    TOUJOURSER
        5
    TOUJOURSER  
    OP
       Nov 29, 2020
    @yianing 大佬,上面加了补充
    feast
        7
    feast  
       Nov 29, 2020
    ARCH= OS= 你宏都不定义 跨平台编译个啥?
    reus
        8
    reus  
       Nov 29, 2020
    你如果真的用了 export CGO_ENABLED=0 GOOS=linux GOARCH=amd64
    那编译出来的不会是 Mach-O 文件
    而且就算你正确用了,也还是需要 gcc/clang 工具链的,相当麻烦,还是找个 linux 机器吧
    12101111
        9
    12101111  
       Nov 29, 2020
    @reus CGO_ENABLED=0 是不需要 gcc/clang 的
    reus
        10
    reus  
       Nov 29, 2020
    raaaaaar
        11
    raaaaaar  
       Nov 29, 2020 via Android
    推荐直接在目标平台下编译
    TypeError
        12
    TypeError  
       Nov 29, 2020 via Android
    我也感觉交叉编译很麻烦,不过 Windows 的 wsl 真爽,直接在 Linux 下编译
    cmostuor
        13
    cmostuor  
       Nov 29, 2020
    谷歌的 golang 团队是时候把 go 写成和 java 一样 加个 gvm 一次编译到处运行
    mrowng123
        14
    mrowng123  
       Nov 29, 2020
    最简单的是用 docker 编译,一身轻松。不用担心交叉编译的问题。
    Jirajine
        15
    Jirajine  
       Nov 29, 2020 via Android
    go 对交叉编译支持还算比较好的了,最简单的办法还是直接用目标架构 /系统的虚拟机或在线的 CI/CD 编译。
    hahasong
        16
    hahasong  
       Nov 30, 2020 via iPhone
    别信 go 的交叉编译,就算能跑,二进制大小也比 Linux 下直接编译的大,经常有莫名的问题
    abersheeran
        17
    abersheeran  
       Nov 30, 2020
    用 Docker 拉一个最小镜像编译去
    q569321245
        18
    q569321245  
       Apr 15, 2021
    ```
    我现在也遇到这样的问题 请问下当时你是怎么解决的
    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
       Apr 17, 2021
    @q569321245 没解决,后来用的 docker 镜像去编译的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1051 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 18:02 · PVG 02:02 · LAX 11:02 · JFK 14:02
    ♥ Do have faith in what you're doing.