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

时间:2015-06-26 18:31:16

标签: linux gcc linker glibc libc

好的,所以我想链接较低版本的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有效。)

所以,我的问题是,我怎么知道我可以链接哪些版本的各种功能?甚至哪些可用?还有其他一些我应该给纳米喂食吗?我在检查错误的库吗?

谢谢!

1 个答案:

答案 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库。