Todos eles servem a propósitos diferentes:
-
/lib/i386-linux-gnu/libc.so.6
é um link simbólico para a biblioteca x86 C de 32 bits, usada para executar executáveis de 32 bits; -
/lib/x86_64-linux-gnu/libc.so.6
é um link simbólico para a biblioteca x86 C de 64 bits, usada para executar executáveis de 64 bits; -
/usr/lib/x86_64-linux-gnu/libc.so
é (geralmente) um script de vinculador apontando para a biblioteca C de 64 bits (dinâmica ou compartilhada, conforme necessário) e vinculador dinâmico e é usado para vincular executáveis de 64 bits (ao criá-los ).
Existem três tipos diferentes de links ao criar e executar programas:
- vinculação estática: o vinculador de tempo de criação (
ld
) resolve todos os objetos usados no programa durante a criação, mescla os objetos usados e produz um binário executável que não usa bibliotecas externas; - vinculação dinâmica, em tempo de compilação:
ld
resolve todos os objetos usados no programa, mas em vez de armazená-los no executável, armazena apenas referências a eles; - vinculação dinâmica, em tempo de execução: o vinculador de tempo de execução (
ld.so
) ou vinculador dinâmico resolve todas as referências armazenadas no executável, carregando todas as bibliotecas necessárias e atualizando todas as referências de objeto antes de executar o programa .
O script libc.so
linker fornece instruções para ld
, na forma de um script de vinculador:
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libc_nonshared.a AS_NEEDED ( /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ) )
Normalmente, as bibliotecas dinâmicas são configuradas usando apenas links simbólicos ( libfoo.so
é usado por ld
e aponta para libfoo.so.1
ou o que for usado por ld.so
e é geralmente um link simbólico para o atualmente instalado versão da biblioteca, por exemplo libfoo.so.1.2.3
). No caso da biblioteca GNU C, embora os programas sejam vinculados dinamicamente ainda precisem de alguns símbolos da biblioteca estática, um script de vinculação é usado para que o vinculador possa tentar os dois. O script de vinculador também se refere ao vinculador dinâmico que será usado em tempo de execução ( /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
acima) e cujo nome está incorporado em executáveis (em .interp
).
Os termos "vinculador dinâmico" e "carregador dinâmico" são sinônimos e usados de forma intercambiável (consulte o ld.so
manpage ).