Ao explorar o binário C++, descubro que libstdc++.so.6 está vinculado a libm.so.6
and libc.so.6
:
ldd /lib/x86_64-linux-gnu/libstdc++.so.6
linux-vdso.so.1 (0x00007ffcb737b000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd3b2295000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd3b1c00000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd3b2396000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd3b2275000)
Minhas perguntas são:
O que
6
significa no nome? Originalmente pensei que fosse a versão do glibc, mas a versão é2.35
, o que não é relevante para6
.strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_2.3 GLIBC_2.3 ... GLIBC_2.35
Por que o sufixo é
6
tão popular?Existe uma programação de quando
libc.so.7
será lançado?
O sufixo 6 é usado por motivos históricos, detalhados em
man libc
Linux. Essencialmente, um fork da biblioteca GNU C foi usado no Linux; este lançou as versões principais 2 a 5. A versão 5 usou ELF e foi publicada com uma biblioteca compartilhada soname delibc.so.5
. Quando a versão 2 da biblioteca GNU C foi lançada no Linux, ela usou a biblioteca compartilhada sonamelibc.so.6
para evitar confusão com bibliotecas anteriores.Bibliotecas relacionadas usam o mesmo sufixo. Algumas arquiteturas usam um sufixo ligeiramente diferente; por exemplo, a biblioteca GNU C em Alpha e Itanium é
libc.so.6.1
.A biblioteca GNU C tem um forte histórico de compatibilidade com versões anteriores e usa muitos mecanismos diferentes para suportar a introdução de mudanças significativas sem quebrar binários antigos (incluindo símbolos versionados). Um novo soname (
libc.so.7
) só seria usado se uma alteração significativa que não pudesse ser mitigada fosse absolutamente necessária, então é improvável que vejamos uma em breve.É a versão ABI ( Application Binary Interface ).
Ele só é incrementado quando uma alteração significativa é feita, o que agora é fortemente evitado para
libc
, portanto, a maioria das distribuições já está ativalibc.so.6
há algum tempo.Em geral, permite que múltiplas versões incompatíveis de uma biblioteca existam em um sistema ao mesmo tempo, suportando diferentes aplicações que foram construídas para diferentes versões.
Por exemplo, o Ubuntu 18.04 forneceu
libcurl.so.3
(via packagelibcurl3
) elibcurl.so.4
(via packagelibcurl4
), ambos construídos a partir do cURL versão 7.58.0.