【问题标题】:Go build with another glibc使用另一个 glibc 构建
【发布时间】:2019-08-22 07:41:59
【问题描述】:

我已经安装了另一个版本的 GLIBC,并且想针对这个新的 GLIBC 编译 Golang 代码。

我尝试过以下命令进行动态编译:

go build --ldflags '-linkmode external -L /path/to/another_glibc/

但是当我运行 ldd "go_executable" 时,它仍然显示链接到默认 glibc。

输出:

linux-vdso.so.1 =>  (0x00007fff29da7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f128a93c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f128ad06000)

预期输出:

linux-vdso.so.1 =>  (0x00007fff45fa7000)
libc.so.6 => /another_glibc/lib/libc.so.6 (0x00007f5cd2067000)
/another_glibc/ld-2.29.so => /lib64/ld-linux-x86-64.so.2 (0x00007f5cd2420000)

这里缺少什么?

【问题讨论】:

    标签: go build glibc dynamic-linking libc


    【解决方案1】:

    在做之前go build 设置

    CGO_LDFLAGS

    动态:

    export CGO_LDFLAGS="-Xlinker -rpath=/path/to/another_glibc/lib"
    

    静态:

    export CGO_LDFLAGS="-Xlinker -rpath=/path/to/another_glibc/lib -static"
    

    CGO_LDFLAGS 允许您为 Go 设置类似 GCC 的 ld 标志。

    【讨论】:

      【解决方案2】:

      bitbyter's answer 对于动态情况不正确,因为它要求系统动态链接器与非系统 glibc 兼容,这不太可能。您可以像这样设置动态链接器:

      export CGO_LDFLAGS="-Xlinker -rpath=/path/to/another_glibc/lib64"
      CGO_LDFLAGS="$CGO_LDFLAGS -Xlinker --dynamic-linker="/path/to/another_glibc/lib64/ld-linux-x86-64.so.2"
      

      动态链接器名称是特定于架构的,因此您必须研究它的名称。

      【讨论】:

      • 我没有遇到动态链接器不兼容的问题,因此没有进一步考虑。感谢您尝试下一步,以防我的答案中的命令不起作用。
      猜你喜欢
      • 2019-08-03
      • 2021-05-09
      • 2016-01-30
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多