如何找到应用程序链接的libc版本?

在使用g++构建应用程序时,我没有明确地将libc库作为要链接的库传递,就像你对其他库(比如传递-lpthread)所做的那样。
我知道libc有libc.so.6这个名字,但我知道这实际上不是一个库,而更像是指向另一个版本的libc的指针(比如libc-2.15.so)。
如果我的计算机上有多个版本的libc,我如何通过libc.so.6来确定实际使用的是哪个版本?
1个回答

ldd 应该是您的首选工具。它可以提供实际链接的共享库。

confus@confusion:~/misc/test$ ldd -r -v testendian
    linux-vdso.so.1 =>  (0x00007fffbcfff000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1a5a4c5000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f1a5a8a5000)

    Version information:
    ./testendian:
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libc.so.6:
        ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
        ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2

在libc的情况下,您只需运行.so文件,就会告知库的版本。
confus@confusion:~/misc/test$ /lib/x86_64-linux-gnu/libc.so.6 
GNU C Library (Ubuntu EGLIBC 2.15-0ubuntu10) stable release version 2.15, by Roland McGrath et al.

1谢谢你的回答。你能提供一些关于ldd输出的信息吗?这是不是意味着testendian需要GLIBC_2.3或者GLIBC_2.2.5? - bonanza
我相当确定,这意味着该程序需要GLIBC 2.2.5,并且库加载器ld-linux-x86-64是使用GLIBC_2.3构建的。所以两者都有关系。但是请谨慎对待这个说法,因为我没有找到参考资料。 - con-f-use
1对于动态可执行文件非常有效,但对于静态可执行文件效果不太好!(因为我需要测试正在链接的内容,以避免gcc警告:`警告:在静态链接应用程序中使用'getaddrinfo'需要运行时与链接使用的glibc版本相匹配的共享库) - jpaugh

  • 相关问题