好的,所以我想链接较低版本的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的链接),我看到它似乎提供了版本2.0和2.3的realpath:
observers: [
'_selectSection(card.sections, currentSectionIndex)'
],
_selectSection(sections, index) {
this.$.sectionSelector.select(sections[index]);
}
但是,如果我尝试链接到realpath@GLIBC_2.0:
> nm /lib/libc.so.6 | grep realpath@
4878d610 T realpath@@GLIBC_2.3
48885c20 T realpath@GLIBC_2.0
...我收到错误:
__asm__(".symver realpath,realpath@GLIBC_2.0");
然而,使用realpath@GLIBC_2.3可以工作......并且示例中的代码,realpath @ GLIBC_2.2.5可以工作 - 尽管根据nm,没有这样的符号存在。 (仅供参考,如果我在没有任何> 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
指令的情况下进行编译,则使用nm进行检查,我看到它与realpath@GLIBC_2.3相关联,这是有道理的;我确认链接到realpath@GLIBC_2.2.5有效。)
所以,我的问题是,我怎么知道我可以链接哪些版本的各种功能?甚至哪些可用?还有其他一些我应该给纳米喂食吗?我在检查错误的库吗?
谢谢!
答案 0 :(得分:1)
在我看来,你把你的库和二进制文件混淆了一下......
大多数Linux发行版上的 /lib/libc.so.6
是一个32位共享对象,应包含*@GLIBC_2.0
个符号。但是,如果您使用的是x86_64平台,我希望GCC默认生成64位二进制文件。 64位二进制文件通常与/lib64/libc.so.6
链接,后者不包含旧版glibc版本(如2.0)的兼容性符号 - 当时x86_64架构甚至不存在......
尝试使用*@GLIBC_2.0
GCC标志编译-m32
程序,以强制链接到32位C库。