Como encontro a qual versão do libc meu aplicativo está vinculado?

14

Ao criar um aplicativo usando g ++, não passo explicitamente a biblioteca libc como uma biblioteca para vincular da mesma maneira que você faria para outras bibliotecas (como passar -lpthreadpor exemplo). Eu sei que libc tem o nome so, libc.so.6mas sei que isso não é realmente uma biblioteca, mas algo como um ponteiro para outra versão da libc (como libc-2.15.so). Minha pergunta é: se eu tinha várias versões do libc no meu computador, como posso saber a qual delas realmente está vinculada libc.so.6?

mathematician1975
fonte

Respostas:

16

ldddeve ser a ferramenta de sua escolha. Isso fornece a biblioteca compartilhada realmente vinculada.

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

No caso da libc, você pode simplesmente executar o .soarquivo e a versão da biblioteca será informada.

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.
confundir
fonte
Eu sabia sobre o ldd, mas não sabia que você poderia executar uma biblioteca - obrigado. Infelizmente a minha saída da execução da biblioteca não mostra a versão ....
mathematician1975
Desconsidere que eu estava sendo um idiota - obrigado pela resposta!
mathematician1975
1
Obrigado pela resposta. Você pode fornecer algumas informações sobre o que a saída ldd me diz? Isso significa que testendianrequer GLIBC_2.3 ou GLIBC_2.2.5?
Bonanza
Tenho certeza de que isso significa que o programa precisa do GLIBC 2.2.5 e o carregador da biblioteca ld-linux-x86-64 foi construído com o GLIBC_2.3. Então, de certa forma. Mas leve isso com um grão de sal, pois não encontrei uma referência.
con-f-use
Funciona muito bem para executáveis ​​dinâmicos, mas não tanto para os estáticos! (Eu preciso testar o que eu estou ligando contra becauses de um aviso gcc: warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking)
jpaugh