-
Sí, se vincula solo cuando se inicializa. Técnicamente, el enlazador dinámico no necesita la resolución y reubicación de objetos por sí mismo, ya que se resuelve completamente tal cual, pero define símbolos y tiene que cuidarlos al resolver el binario que está "interpretando", y esos símbolos se actualizan para señalar sus implementaciones en las bibliotecas cargadas. En particular, esto afecta a
malloc
— el enlazador tiene una versión mínima incorporada, con el símbolo correspondiente, pero se reemplaza por la versión de la biblioteca C una vez que se carga y se reubica (o incluso por una versión interpuesta si hay una), con cierto cuidado para garantizar que esto no ocurra. no sucederá en un punto en el que podría romper el enlazador.Los detalles sangrientos están en
rtld.c
, en eldl_main
función.Tenga en cuenta, sin embargo, que
ld.so
no tiene dependencias externas. Puedes ver los símbolos involucrados connm -D
; ninguno de ellos está indefinido. -
La página de manual solo hace referencia a las entradas directamente bajo
/lib
, es decir,/lib/ld.so
(el enlazador dinámico libc 5, que admitea.out
) y/lib*/ld-linux*.so*
(el enlazador dinámico libc 6, que admite ELF). La página de manual es muy específico, yld.so
no esld-2.28.so
.El enlazador dinámico que se encuentra en la gran mayoría de los sistemas actuales no incluye
a.out
apoyo.
file
y ldd
informan cosas diferentes para el enlazador dinámico porque tienen definiciones diferentes de lo que constituye un binario enlazado estáticamente. Para ldd
, un binario está enlazado estáticamente si no tiene DT_NEEDED
símbolos, es decir, sin símbolos indefinidos. Para file
, un binario ELF está vinculado estáticamente si no tiene un PT_DYNAMIC
sección (esto cambiará en el lanzamiento de file
siguiente 5.37; ahora usa la presencia de un PT_INTERP
sección como el indicador de un binario vinculado dinámicamente, que coincide con el comentario en el código).
El enlazador dinámico de la biblioteca GNU C no tiene ningún DT_NEEDED
símbolos, pero tiene un PT_DYNAMIC
sección (ya que técnicamente es una biblioteca compartida). Como resultado, ldd
(que es el enlazador dinámico) indica que está enlazado estáticamente, pero file
indica que está vinculado dinámicamente. No tiene un PT_INTERP
sección, por lo que la próxima versión de file
también indicará que está vinculado estáticamente.
$ ldd /lib64/ld-linux-x86-64.so.2
statically linked
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
(con file
5.35)
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
(con la versión actualmente en desarrollo de file
).