gpt4 book ai didi

linux - 告诉哪个版本的符号可用于链接(在 libc 中)?

转载 作者:太空宇宙 更新时间:2023-11-04 10:50:56 29 4
gpt4 key购买 nike

好的,所以我想链接到较低版本的 libc/glibc,以实现兼容性。我注意到这个关于如何根据具体情况执行此操作的答案:

How can I link to a specific glibc version? https://stackoverflow.com/a/2858996/920545

然而,当我尝试自己应用它时,我遇到了问题,因为我不知道我应该使用哪个较低版本号来链接。使用答案中的示例,如果我使用“nm”检查我的/lib/libc.so.6 提供的符号(在我的例子中,它是指向 libc-2.17.so 的链接),我看到它似乎提供了 realpath 的 2.0 和 2.3 版本:

> nm /lib/libc.so.6 | grep realpath@
4878d610 T realpath@@GLIBC_2.3
48885c20 T realpath@GLIBC_2.0

但是,如果我尝试链接 realpath@GLIBC_2.0:

__asm__(".symver realpath,realpath@GLIBC_2.0");

...我得到一个错误:

> gcc -o test_glibc test_glibc.c
/tmp/ccMfnLmS.o: In function `main':
test_glibc.c:(.text+0x25): undefined reference to `realpath@GLIBC_2.0'
collect2: error: ld returned 1 exit status

但是,使用 realpath@GLIBC_2.3 是有效的……并且示例中的代码 realpath@GLIBC_2.2.5 是有效的——尽管根据 nm,不存在这样的符号。 (仅供引用,如果我在没有任何 __asm__ 指令的情况下进行编译,然后使用 nm 检查,我看到它链接到 realpath@GLIBC_2.3,这是有道理的;我确认链接到 realpath@GLIBC_2.2.5有效。)

所以,我的问题是,我怎么知道我可以链接到各个函数的哪个版本?甚至哪些可用?还有其他一些我应该喂给 nm 的 kwargs 吗?我是否检查了错误的库?

谢谢!

最佳答案

在我看来,您有点混淆了库和二进制文件...

/lib/libc.so.6 在大多数 Linux 发行版上是一个 32 位共享对象,应该包含 *@GLIBC_2.0 符号。不过,如果您使用的是 x86_64 平台,我希望 GCC 默认生成 64 位二进制文​​件。 64 位二进制文​​件通常链接到 /lib64/libc.so.6,它不包含旧 glibc 版本(如 2.0)的兼容性符号 - 当时 x86_64 架构甚至不存在......

尝试使用 -m32 GCcflags编译您的 *@GLIBC_2.0 程序以强制链接到 32 位 C 库。

关于linux - 告诉哪个版本的符号可用于链接(在 libc 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31079896/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com