Os vinculadores dinâmicos são intercambiáveis?

Os vinculadores dinâmicos são intercambiáveis?

Os vinculadores dinâmicos são intercambiáveis?

Digamos que eu compile um programa, por exemplo com gcc, vinculando várias bibliotecas dinâmicas, com o programa para ser usado em tempo de execução com o vinculador gnu para resolver os símbolos da biblioteca dinâmica. E em vez de usar o vinculador gnu, tenho outro vinculador que preciso ou desejo usar.

Isso funcionará? Porque porque não?

Responder1

Presumo que por “vinculador dinâmico”, você está se referindo ao vinculador/carregador dinâmico, normalmente conhecido como ld.so, em vez do vinculador usado na construção de programas, ld.

O vinculador/carregador dinâmico está fortemente acoplado à biblioteca C à qual está associado ou até mesmo faz parte. No Linux, como normalmente discutido aqui, o carregador usual é o carregador da biblioteca GNU C; se você observar seus símbolos, verá que ele extrai símbolos da biblioteca C:

$ nm -D /lib/ld-linux.so.2 | grep -E ' A|D '
00028898 D _dl_argv
00000000 A GLIBC_2.0
00000000 A GLIBC_2.1
00000000 A GLIBC_2.3
00000000 A GLIBC_2.4
00000000 A GLIBC_PRIVATE
00028f28 D __libc_enable_secure
00028f24 D __libc_stack_end
00029040 D _rtld_global
000288a0 D _rtld_global_ro

VerComo o próprio vinculador/carregador dinâmico pode ser vinculado dinamicamente conforme relatado por `file`?para obter detalhes de como isso funciona.

Bibliotecas C alternativas fornecem seus próprios carregadores dinâmicos; por exemplo, programas construídos commuçulmanaem x86_64 especifique seu “interpretador” como /lib/ld-musl-x86_64.so.1, que é um link para a própria biblioteca musl C:

$ ls -l /lib/ld-musl-x86_64.so.1
lrwxrwxrwx 1 root root 25 Jan 23  2019 /lib/ld-musl-x86_64.so.1 -> x86_64-linux-musl/libc.so

Os carregadores contam com recursos fornecidos por suas bibliotecas C associadas e vice-versa. Istoseriatecnicamente seria possível substituir um determinado carregador por uma implementação compatível, mas você estaria efetivamente reescrevendo o carregador existente, no mínimo. Embora a especificação básica de um carregador dinâmico seja bem definida e limitada - carregando um binário ELF (no Linux), bibliotecas dinâmicas associadas e realizando a realocação necessária, etc. - e pode-se, portanto, imaginar a substituição de qualquer carregador por outro, os detalhes da implementação são todos significativos.

Observe que, desde que cada carregador dinâmico tenha um nome canônico diferente, é possível que um único sistema tenha carregadores diferentes, usados ​​pelos programas conforme apropriado. É assim que é possível que um sistema baseado em biblioteca GNU C também seja usado para construir e executar binários musl e abre caminho para esforços comollvm-libc, ou mesmo historicamente, a mudança de libc.so.5para libc.so.6.

Responder2

Eles devem ser intercambiáveis.

Uma boa discussão sobre eg ldvs goldpode ser encontrada aqui:https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experiência

Verifique também isto:https://stackoverflow.com/questions/29361801/is-the-lld-linker-a-drop-in-replacement-for-ld-and-gold

Há também o LLD do projeto LLVM que promete ser oo mais rápidode todos eles.

informação relacionada