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.5
para libc.so.6
.
Responder2
Eles devem ser intercambiáveis.
Uma boa discussão sobre eg ld
vs gold
pode 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.