当我在Ubuntu Lucid 10.04 PC上编译东西时,它会与glibc链接。Lucid使用glibc 2.11。当我在具有旧版glibc的另一台PC上运行此二进制文件时,该命令失败,提示没有glibc 2.11 …
据我所知,glibc使用符号版本控制。我可以强制gcc链接到特定的符号版本吗?
在我的具体用法中,我尝试为ARM编译gcc跨工具链。
您是正确的,因为glibc使用符号版本控制。如果你是好奇,符号版本实施的glibc 2.1介绍介绍这里是太阳的符号版本方案中描述的扩展这里。
一种选择是静态链接您的二进制文件。这可能是最简单的选择。
您也可以在chroot构建环境中构建二进制文件,或使用glibc- new => glibc - old 交叉编译器来构建二进制文件。
根据http://www.trevorpounds.com博客文章 链接到较旧版本的符号(glibc) ,只要使用相同的 .symver 伪 指令 就可以强制将任何符号 链接到较旧的符号 ,只要该符号有效- op,用于首先定义版本化符号。以下示例摘自博客文章。
.symver
以下示例利用了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; }