一尘不染

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

linux

当我在Ubuntu Lucid 10.04 PC上编译东西时,它会与glibc链接。Lucid使用glibc
2.11。当我在具有旧版glibc的另一台PC上运行此二进制文件时,该命令失败,提示没有glibc 2.11 …

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

在我的具体用法中,我尝试为ARM编译gcc跨工具链。


阅读 959

收藏
2020-06-02

共1个答案

一尘不染

您是正确的,因为glibc使用符号版本控制。如果你是好奇,符号版本实施的glibc
2.1介绍介绍这里是太阳的符号版本方案中描述的扩展这里

一种选择是静态链接您的二进制文件。这可能是最简单的选择。

您也可以在chroot构建环境中构建二进制文件,或使用glibc- new => glibc - old 交叉编译器来构建二进制文件。

根据http://www.trevorpounds.com博客文章

链接到较旧版本的符号(glibc)

,只要使用相同的 .symver
指令

就可以强制将任何符号
链接到较旧的符号

,只要该符号有效-
op,用于首先定义版本化符号。以下示例摘自博客文章

以下示例利用了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;
}
2020-06-02