使用另一个 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"
动态链接器名称是特定于体系结构的,因此您必须研究它的名称。
我已经安装了另一个版本的 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 标志。
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"
动态链接器名称是特定于体系结构的,因此您必须研究它的名称。