使用另一个 glibc 构建

Go build with another glibc

我已经安装了另一个版本的 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 设置

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 标志。

对于动态情况不正确,因为它要求系统动态链接器与非系统 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"

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