当前位置: 首页 > 面试题库 >

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

蒙奇
2023-03-14
问题内容

当我在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,用于首先定义版本化符号。以下示例摘自博客文章。

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


 类似资料:
  • 问题内容: 我正在编译一些在Debian Linux系统上使用libcurl的代码。我的开发机正在运行Debian 5,但我也希望二进制文件也可以在较旧的Debian 4系统上使用。 我发现如果指定 -lcurl ,它将链接到libcurl.so.4,但是Debian 4系统仅具有libcurl.so.3 有什么方法可以告诉GCC链接到libcurl.so.3(在Debian 4和5中都存在)还是

  • 问题内容: 我有一个已删除的文件,但仍保持打开程序的状态。我使用lsof找到了索引节点号。如何创建硬链接回到该索引节点? 任何代码都会有所帮助,但是Perl会很方便。 问题答案: 从/ proc / pid / fd / 文件描述符 复制 __ 使用lsof查找pid和文件描述符。

  • 问题内容: 我正在编写一个与GNU GPL不兼容的跨平台应用程序。我当前面临的主要问题是该应用程序与glibc和libstdc ++动态链接,并且几乎所有对库的新更新都不向后兼容。因此,在我的应用程序中会看到随机崩溃。 解决方法是,将应用程序的二进制文件分发在几个不同的系统(具有不同的C / C 运行时版本)上编译。但我要没有这个。所以我的问题是,请牢记许可和所有注意事项,我可以静态链接glibc

  • 它是在Android上的,在加载到WebView之前需要修复html。 这可以在JAVA内部完成还是必须在WebView的JavaScript内部完成?

  • 问题内容: 安装新的构建机器后,我发现它带有标准C ++库的6.0.10 但是,我们的许多目标计算机仍使用旧版本的libstdc ++,例如: 显然,在最后两个0.0.1中,ABI发生了变化,因为尝试运行程序会导致 我尝试明确安装旧版本的gcc,但没有帮助。升级目标计算机是我无法控制的,因此不是一种选择。使我的构建在具有较旧libstdc ++的计算机上工作的最佳方法是什么? 我在apt-cach

  • 问题内容: 后续问题应用程序在运行时如何解析为共享库的不同版本?,我想知道如何在链接命令行上指定要使用哪个版本的库? 假设我有 指定库与可执行文件链接的通常方法不会显示要使用的版本。此外,很可能要链接到最新版本。因此,通常的线路在大多数情况下都可以正常工作。 使用该库的版本1 进行链接的命令行是什么? 问题答案: 链接器也可以接受文件名 来自: -l namespec --library = na