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

标签 linux gcc linker glibc libc

当我在 Ubuntu Lucid 10.04 PC 上编译某些内容时,它会与 glibc 链接。 Lucid 使用 glibc 2.11。当我在另一台装有较旧 glibc 的电脑上运行此二进制文件时,该命令失败,提示没有 glibc 2.11...

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

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

最佳答案

您是正确的,glibc 使用符号版本控制。如果您好奇,可以了解 glibc 2.1 中引入的符号版本控制实现 here是 Sun 符号版本控制方案的扩展,如 here 所示。 .

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

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

根据http://www.trevorpounds.com博客文章 Linking to Older Versioned Symbols (glibc) ,只要使用与最初定义版本符号相同的 .symver 伪操作,就可以强制任何符号链接(symbolic link)到旧符号。以下示例摘自 blog post .

以下示例使用 glibc 的实际路径,但确保它链接到较旧的 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;
}

关于linux - 如何链接到特定的 glibc 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14589470/

相关文章:

python - 使用嵌入式 Python/C 函数编译文件 .c

基于 c 中的 EBP 从堆栈帧调用函数及其参数

c - 为什么retarget.o归档到静态库中时,retarget.c中的 "_write"等函数没有链接?

c++ - 在 extern C 声明中,对象和 void 指针可以互换吗?

linux - 轻松交换 terraform 版本的工具

linux - 在 perl cron 脚本中不需要\r

python - Django:使用 mod_wsgi 创建的 SOCK 文件的权限错误

linux - 如何以 yyyy-MM-ddTHH :mm:ssZ using date command in linux 格式打印时间

c - 简单 C 程序中的有点深奥的 gcc 错误

c++ - Visual Studio 在编译 32 位时尝试使用 64 位 C 运行时库