The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
TOUJOURSER
0.01D

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

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