当我在我的UbuntuLucid10.04电脑上编译一些东西时,它会被链接到glibc上.Lucid使用2.11的glibc.当我在另一台装有旧版glibc的PC上运行这个二进制文件时,命令失败,表示没有glibc 2.11...
据我所知,glibc使用符号版本控制.我可以强制gcc链接特定的符号版本吗?
在我的具体使用中,我试图为ARM编译一个gcc交叉工具链.
当我在我的UbuntuLucid10.04电脑上编译一些东西时,它会被链接到glibc上.Lucid使用2.11的glibc.当我在另一台装有旧版glibc的PC上运行这个二进制文件时,命令失败,表示没有glibc 2.11...
据我所知,glibc使用符号版本控制.我可以强制gcc链接特定的符号版本吗?
在我的具体使用中,我试图为ARM编译一个gcc交叉工具链.
glibc使用符号版本控制是正确的.如果您好奇的话,glibc 2.1中引入的符号版本控制实现将在here中介绍,它是Sun here中描述的符号版本控制方案的扩展.
一种 Select 是静态链接二进制文件.这可能是最简单的 Select .
您还可以在chroot构建环境中构建二进制文件,或者使用glibc-new=>;glibc-old交叉编译器.
根据.symver" rel="noreferrer">blog post08085632/http://www.trevorpounds.com/blog/" rel="noreferrer">http://www.trevorpounds.com篇博文Linking to Older Versioned Symbols (glibc),可以通过使用最初用于定义版本符号的同一个103伪操作,强制任何符号与旧符号链接,只要它有效.下面的例子摘自blog post.
下面的示例使用了glibc的realpath,但确保它与旧的2.2.5版本相链接.
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
__asm__(".symver realpath,realpath@GLIBC_2.2.5");
int main()
{
const char* unresolved = "/lib64";
char resolved[PATH_MAX+1];
if(!realpath(unresolved, resolved))
{ return 1; }
printf("%s\n", resolved);
return 0;
}