当我在我的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;
}

Linux相关问答推荐

排除最大FIFO大小故障

在CefExecuteProcess;之前创建新线程会导致CEF应用程序崩溃并显示SIGTRAP

为什么在Linux上STD::SLEEP_FOR(STD::Chrono::Hors::Max())会立即返回?

条件句if的正确写法是怎样的?

在 Bash 中使用 shell 脚本从文件中解析版本号

x64 NASM 汇编程序在程序开始时显示分段错误

使用 PowerShell 删除重复行所需的时间比 WSL 长得多

使用 sed 命令仅打印正则表达式匹配

将特定列转换为行

如何使用 shell 脚本查找具有最大上下文长度的行号?

Linux上Kvaser数据库编辑器的等效工具

Linux/Unix 手册页语法约定

在 Linux 下将 TCP 流量重定向到 UNIX 域套接字

为什么 XGrabKey 会生成额外的聚焦和聚焦事件?

模拟器在内核映像文件中找不到Linux 版本字符串

我想为 Linux 内核做贡献

php.ini 更改,但在 Ubuntu 上无效

Bash 将 awk 的输出捕获到数组中

find -name "*.xyz" -o -name "*.abc" -exec 对所有找到的文件执行,而不仅仅是指定的最后一个后缀

libaio.so.1:无法打开共享对象文件