Considere las dependencias de objetos compartidos de /bin/bash
, que incluye /lib64/ld-linux-x86-64.so.2
(enlazador / cargador dinámico):
ldd /bin/bash
linux-vdso.so.1 (0x00007fffd0887000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f57a04e3000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f57a04de000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f57a031d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f57a0652000)
La inspección /lib64/ld-linux-x86-64.so.2
muestra que es un enlace simbólico para /lib/x86_64-linux-gnu/ld-2.28.so
:
ls -la /lib64/ld-linux-x86-64.so.2
lrwxrwxrwx 1 root root 32 May 1 19:24 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so
Además, los file
informes /lib/x86_64-linux-gnu/ld-2.28.so
para sí mismo se vincularán dinámicamente:
file -L /lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
Me gustaría saber:
- ¿Cómo se puede
/lib64/ld-linux-x86-64.so.2
vincular dinámicamente el enlazador / cargador ( ) en sí? ¿Se vincula en tiempo de ejecución? /lib/x86_64-linux-gnu/ld-2.28.so
está documentado para manejar a.out binarios (man ld.so
), pero ¿/bin/bash
es un ELF ejecutable?
El programa ld.so maneja a.out binarios, un formato usado hace mucho tiempo; ld-linux.so * (/lib/ld-linux.so.1 para libc5, /lib/ld-linux.so.2 para glibc2) maneja ELF, que todo el mundo ha estado utilizando durante años.
linux
dynamic-linking
shared-library
file-command
Shuzheng
fuente
fuente
/lib/x86_64-linux-gnu/ld-2.28.so
, debian 10 buster)file
el comentario erróneo de cómo define los binarios estáticos y la realidad deld-2.28.so
... El diferenciador esPT_DYNAMIC
.Respuestas:
Sí, se vincula cuando se inicializa. Técnicamente, el enlazador dinámico no necesita resolución de objetos y reubicación por sí mismo, ya que está completamente resuelto tal como está, pero sí define símbolos y debe cuidarlos cuando resuelve el binario que está "interpretando", y esos símbolos se actualizan para señalar sus implementaciones en las bibliotecas cargadas. En particular, esto afecta
malloc
: el enlazador tiene una versión mínima incorporada, con el símbolo correspondiente, pero que 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 algo de cuidado tomado para asegurar que esto no suceda en un punto donde pueda romper el enlazador.Los detalles sangrientos están
rtld.c
en ladl_main
función.Sin embargo,
ld.so
tenga en cuenta que no tiene dependencias externas. Puedes ver los símbolos involucrados connm -D
; ninguno de ellos es indefinido.La página de manual solo se refiere a las entradas directamente debajo
/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ífica, yld.so
no lo esld-2.28.so
.El enlazador dinámico que se encuentra en la gran mayoría de los sistemas actuales no incluye
a.out
soporte.file
eldd
informan diferentes cosas para el enlazador dinámico porque tienen diferentes definiciones de lo que constituye un binario enlazado estáticamente. Paraldd
, un binario está estáticamente vinculado si no tieneDT_NEEDED
símbolos, es decir , no tiene símbolos indefinidos. Parafile
, un binario ELF está vinculado estáticamente si no tiene unaPT_DYNAMIC
sección (esto cambiará en el lanzamiento delfile
siguiente 5.37; ahora usa la presencia de unaPT_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ímbolo, pero tiene unaPT_DYNAMIC
sección (ya que técnicamente es una biblioteca compartida). Como resultado,ldd
(que es el vinculador dinámico) indica que está vinculado estáticamente, perofile
indica que está vinculado dinámicamente. No tiene unaPT_INTERP
sección, por lo que la próxima versión defile
también indicará que está vinculada estáticamente.(con
file
5.35)(con la versión actualmente en desarrollo de
file
).fuente
/lib*/ld-linux*.so*
un tercer enlazador dinámico?ldd
informes del enlazador dinámico como enlazados estáticamente? ¿Porque su lista de dependencias de objetos compartidos está vacía?/lib*/ld-linux*.so*
. Especifiqué el origen del enlazador dinámico porque hay otras implementaciones disponibles para Linux.Sospecho que el
file
programa está equivocado acerca de que el enlazador / cargador dinámico se vincula dinámicamente. Elldd
programa no está de acuerdo. Al menos no en mi sistema (Debian Stretch):man ld.so
también se lee: "ld-linux.so * maneja ELF" . En su sistema (y el mío también por cierto) ambos son enlaces simbólicos al mismo binario que deduzco que es capaz de manejar tanto ELF como el formato a.out (antiguo obsoleto).fuente