我如何链接到特定的glibc版本?

当我在Ubuntu Lucid 10.04 PC上编译一些东西的时候,它会和glibc链接起来。 Lucid使用2.11的glibc。 当我在另一台PC上运行这个二进制文件时,该命令失败,说没有glibc 2.11 …

据我所知glibc使用符号版本。 我可以强制gcc链接到一个特定的符号版本?

在我的具体使用中,我尝试为ARM编译一个gcc交叉工具链。

你是正确的,glibc使用符号版本。 如果您好奇,glibc 2.1中引入的符号版本控制实现在这里描述,并且是这里描述的Sun的符号版本控制scheme的扩展。

一个选项是静态链接你的二进制文件。 这可能是最简单的select。

你也可以在chroot构build环境中构build你的二进制文件,或者使用glibc- new => glibc- cross-compiler。

根据http://www.trevorpounds.com博客文章;链接到旧版本符号(glibc) ,可以强制任何符号链接到一个较旧的,只要它是有效的使用相同的.symver伪操作,用于首先定义版本化符号。 以下示例摘自博客文章 。

下面的例子使用glibc的实际path,但确保它链接到较旧的2.2.5版本。

 #include <limits.h> #include <stdlib.h> #include <stdio.h> __asm__(".symver realpath,realpath@GLIBC_2.2.5"); int main() { char* unresolved = "/lib64"; char resolved[PATH_MAX+1]; if(!realpath(unresolved, resolved)) { return 1; } printf("%s\n", resolved); return 0; } 

静态链接。 当链接器链接到静态链接器时,链接器将库embedded到可执行文件中,所以可执行文件会更大,但是可以在具有旧版本glibc的系统上执行,因为程序将使用它自己的库而不是系统的库。