glibc 指定linux内核,关于linux:如何链接到特定的glibc版本?

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

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

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

这是真正令人烦恼的Linux问题之一,例如解决方案始终是"您不应该这样做",这当然意味着"它不起作用,而且还没有人修复它"。

人们抱怨Windows上的DLL地狱。 我记得Linux上有一些狂热者试图将其作为Windows世界中一个特别可怕的例子来提出。 十多年前,当我第一次从事Linux开发时,我所做的只是把我的脸埋在手中。

您是正确的,因为glibc使用符号版本控制。如果您感到好奇,这里将介绍glibc 2.1中引入的符号版本实现,它是本文所述的Sun符号版本方案的扩展。

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

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

根据http://www.trevorpounds.com博客文章链接到较早版本的符号(glibc),只要使用相同的< x0>伪运算,首先用于定义版本化符号。以下示例摘自博客文章。

以下示例利用了glibc的realpath,但确保将其与较早的2.2.5版本链接。

#include

#include

#include

__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

", resolved);

return 0;

}

glibc不支持静态链接-静态链接的glibc程序在具有不同libc版本的系统上通常无法正常工作。

glibcs libc.a继续存在,在某些情况下glibc支持此功能,尽管不建议这样做(Drepper)。 您会遇到一些琐碎的程序,尤其是使用NSS的程序(常见问题中的解决方法)。

与-static链接。当您与-static链接时,链接器会将库嵌入可执行文件中,因此可执行文件会更大,但可以在具有旧版glibc的系统上执行,因为该程序将使用其自己的库而不是系统库。

通常,您根本不想这样做的原因是因为您分发了一个开源应用程序。 在这种情况下,出于许可的原因,通常不允许静态链接(这样做将需要您释放所有源代码),因此,需要谨慎使用-static。

同时,至少有一个经常可以求助于musl-libc,但是使用C ++程序会使事情变得更加复杂,因此仍然可能需要指定符号版本。

设置1:在没有专用GCC的情况下编译自己的glibc并使用它

由于似乎仅靠符号版本控制是不可能的,所以让我们更进一步,自己编译glibc。

好。

此设置可能有效并且快速,因为它不会重新编译整个GCC工具链,而只是glibc。

好。

但是它不可靠,因为它使用glibc提供的主机C运行时对象,例如crt1.o,crti.o和crtn.o。在以下网址中提到了这一点:https://sourceware.org/glibc/wiki/Testing/Builds?action=recall&rev=21#Compile_against_glibc_in_an_installed_location这些对象会进行glibc所依赖的早期设置,所以如果事情崩溃了,我不会感到惊讶。以及非常巧妙的方式

好。

有关更可靠的设置,请参阅下面的设置2。

好。

构建glibc并在本地安装:

好。

export glibc_install="$(pwd)/glibc/build/install"

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值