¿Son intercambiables los enlazadores dinámicos?

¿Son intercambiables los enlazadores dinámicos?

¿Son intercambiables los enlazadores dinámicos?

Digamos que compilo un programa, por ejemplo con gcc, vinculando varias bibliotecas dinámicas, y el programa se usará en tiempo de ejecución con el vinculador gnu para resolver los símbolos de la biblioteca dinámica. Y en lugar de usar el enlazador gnu, tengo otro enlazador que necesito o quiero usar.

¿Eso funcionará? ¿Por qué por qué no?

Respuesta1

Supongo que por "enlazador dinámico" te refieres al vinculador/cargador dinámico, normalmente conocido como ld.so, en lugar del vinculador utilizado al crear programas ld.

El enlazador/cargador dinámico está estrechamente acoplado con la biblioteca C a la que está asociado, o incluso de la que forma parte. En Linux, como se suele comentar aquí, el cargador habitual es el cargador de la biblioteca GNU C; Si observa sus símbolos, verá que extrae símbolos de la 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

Ver¿Cómo se puede vincular dinámicamente el enlazador/cargador dinámico según lo informado por "archivo"?para obtener detalles sobre cómo funciona esto.

Las bibliotecas C alternativas proporcionan sus propios cargadores dinámicos; por ejemplo, programas creados conmuslen x86_64 especifique su "intérprete" como /lib/ld-musl-x86_64.so.1, que es un enlace a la 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

Los cargadores dependen de las funciones proporcionadas por sus bibliotecas C asociadas y viceversa. ÉlharíaTécnicamente sería posible reemplazar un cargador determinado con una implementación compatible, pero efectivamente estaría reescribiendo el cargador existente, como mínimo. Si bien la especificación básica de un cargador dinámico está bien definida y limitada (cargar un binario ELF (en Linux), bibliotecas dinámicas asociadas y realizar la reubicación necesaria, etc.) y, por lo tanto, uno podría imaginar reemplazar cualquier cargador determinado por otro, los detalles de implementación son todos significativos.

Tenga en cuenta que siempre que cada cargador dinámico tenga un nombre canónico diferente, es posible que un solo sistema tenga diferentes cargadores, utilizados por los programas según corresponda. Así es como es posible que un sistema basado en biblioteca GNU C también se utilice para construir y ejecutar binarios musl, y abre el camino a esfuerzos comollvm-libc, o incluso históricamente, el cambio de libc.so.5a libc.so.6.

Respuesta2

Deben ser intercambiables.

Aquí se puede encontrar una buena discusión sobre, por ejemplo, ldvs :goldhttps://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience

También revisa esto:https://stackoverflow.com/questions/29361801/is-the-lld-linker-a-drop-in-replacement-for-ld-and-gold

También está LLD del proyecto LLVM que promete ser ello más rápidode todos ellos.

información relacionada