ld.so, ld-linux.so* - enlazador/cargador dinámico
Los programas ld.so y ld-linux.so* encuentran y
cargan las bibliotecas compartidas requeridas por un programa, preparan al
programa para ejecutarse y lo ejecutan.
Los ficheros binarios en Linux requieren enlace dinámico
(enlace en tiempo de ejecución) a menos que se dé la
opción -static a ld durante la compilación.
El programa ld.so maneja ficheros binarios con el formato
a.out, un formato usado hace tiempo; ld-linux.so* maneja el formato
ELF (/lib/ld-linux.so.1 para libc5, /lib/ld-linux.so.2 para
glibc2), que es el que se lleva usando desde hace unos años. Por lo
demás, ambos tienen el mismo comportamiento y usan los mismos
ficheros de configuración y programas ldd(1),
ldconfig(8) y /etc/ld.so.conf.
Las bibliotecas compartidas que necesita un programa se buscan en
varios lugares:
- o
- (sólo para ELF) Usando el atributo dinámico de
sección DT_RPATH del binario si está presente y el atributo
DT_RUNPATH no existe. No se aconseja el uso de DT_RPATH.
- o
- Usando la variable de entorno LD_LIBRARY_PATH, salvo cuando el
ejecutable tiene activo el bit setuid/setgid, en cuyo caso se ignora.
- o
- (sólo para ELF) Usando el atributo dinámico de
sección DT_RUNPATH del binario si está presente.
- o
- A partir del fichero caché /etc/ld.so.cache, que contiene
una lista compilada de bibliotecas candidatas encontradas previamente en
la ruta de bibliotecas ampliada. Si, sin embargo, el binario fue enlazado
con la opción -z nodeflib, las bibliotecas que se encuentran
en las rutas predeterminadas son omitidas.
- o
- En la ruta predeterminada /lib, y después en
/usr/lib. Si el binario fue enlazado con la opción
-znodeflib, se omite este paso.
El enlazador dinámico puede ejecutarse bien indirectamente,
al ejecutar un programa o biblioteca enlazado dinámicamente (en cuyo
caso no pueden pasarse opciones en la línea de órdenes al
enlazador dinámico y, en el caso del formato ELF, se ejecuta el
enlazador dinámico que se encuentra almacenado en la sección
.interp del programa), bien directamente ejecutando:
/lib/ld-linux.so.* [OPCIONES] [PROGRAMA [ARGUMENTOS]]
- --list
- Lista todas las dependencias y cómo se resuelven.
- --verify
- Comprueba que el programa está enlazado dinámicamente y que
el enlazador dinámico puede tratarlo.
- --library-path
PATH
- Sobreescribe la variable de entorno LD_LIBRARY_PATH (vea más
abajo).
- --ignore-rpath
LIST
- Ignora la información de RPATH y RUNPATH en los nombres de objeto
en LIST. Esta opción fue soportada por glibc2 aproximadamente
durante una hora. Después se renombró a:
- --inhibit-rpath
LIST
Hay cuatro variables de entorno relevantes.
- LD_LIBRARY_PATH
- Una lista de directorios separados por dos puntos en los que se buscan las
bibliotecas ELF en tiempo de ejecución. Similar a la variable de
entorno PATH.
- LD_PRELOAD
- Una lista adicional de biliotecas compartidas ELF especificadas por el
usuario y separadas por blancos que se cargan antes que el resto. Puede
ser utilizada para sobreescribir funciones en otras bibliotecas
compartidas de manera selectiva. Para binarios ELF con el bit
setuid/setgid activo, sólo se cargan las biliotecas en los
directorios de búsqueda estándares que también tienen
activo el bit setuid.
- LD_BIND_NOW
- (libc5; glibc desde la versión 2.1.1) Si su valor no es la cadena
vacía, el enlazador dinámico resuelve todos los
símbolos al comienzo del programa, en lugar de aplazar la
resolución de las llamadas a funciones hasta el punto donde son
referenciadas por primera vez. Es útil cuando se utiliza un
depurador.
- LD_TRACE_LOADED_OBJECTS
- (sólo para ELF) Si su valor no es la cadena vacía, el
programa produce un listado de las bibliotecas dinámicas de las que
depende, como si se hubiera ejecutado con ldd(1), en lugar de
ejecutar el programa normalmente.
También hay un montón de variables más o
menos oscuras, muchas obsoletas o sólamente para uso interno.
- LD_WARN
- (sólo para ELF)(glibc desde la versión 2.1.3) Si su valor no
es la cadena vacía, avisa sobre los símbolos sin
resolver.
- LD_NOWARN
- (sólo para a.out)(libc5) Suprime los avisos sobre las bibliotecas
a.out con números de versión menor incompatibles.
- LD_BIND_NOT
- (glibc desde la versión 2.1.95) No actualiza el GOT (global offset
table - tabla de desplazamientos global) ni el PLT (procedure linkage
table - tabla de enlace de procedimientos) después de resolver un
símbolo.
- LD_DEBUG
- (glibc desde la versión 2.1) Produce abundante información
de depuración acerca del enlazador dinámico. Si se le asigna
el valor all imprime toda la información de
depuración que posee, si se le asigna el valor help imprime
un mensaje de ayuda con las categorías que pueden especificarse en
esta variable de entorno.
- LD_DEBUG_OUTPUT
- (glibc desde la versión 2.1) Fichero donde irá a parar la
salida de LD_DEBUG, si no se especifica se asume la salida
estándar. LD_DEBUG_OUTPUT se ignora para los binarios con el bit
setuid/setgid activo.
- LD_VERBOSE
- (glibc desde la versión 2.1) Si su valor no es la cadena
vacía, muestra información sobre las versiones de los
símbolos cuando se está solicitando información sobre
el programa (es decir, o bien se ha activado
LD_TRACE_LOADED_OBJECTS, o bien se ha dado al enlazador
dinámico la opción --list o --verify).
- LD_PROFILE
- (glibc desde la versión 2.1) Objeto compartido para el que se desea
obtener el perfil.
- LD_PROFILE_OUTPUT
- (glibc desde la versión 2.1) Fichero donde irá a parar la
salida de LD_PROFILE, si no se especifica se asume la salida
estándar. LD_DEBUG_OUTPUT se ignora para los binarios con el bit
setuid/setgid activo.
- LD_AOUT_LIBRARY_PATH
- (libc5) Versión de LD_LIBRARY_PATH sólo para los binarios
a.out. Las versiones anteriores de ld-linux.so.1 también soportaban
LD_ELF_LIBRARY_PATH.
- LD_AOUT_PRELOAD
- (libc5) Versión de LD_PRELOAD sólo para los binarios a.out.
Las versiones anteriores de ld-linux.so.1 también soportaban
LD_ELF_PRELOAD.
- LD_SHOW_AUXV
- (glibc desde la versión 2.1) Muestra el array auxiliar que se pasa
desde el núcleo.
- LD_HWCAP_MASK
- (glibc desde la versión 2.1) Máscara para las capacidades
hardware.
- LD_ORIGIN_PATH
- (glibc desde la versión 2.1) Ruta donde se encuentra el binario
(para programas con el bit setuid desactivado).
- LD_DYNAMIC_WEAK
- (glibc desde la versión 2.1.91) Permite que los símbolos
débiles se puedan sobrescribir (volviendo al antiguo comportamiento
de glibc).
- LD_KEEPDIR
- (sólo para a.out)(libc5) No ignora el directorio en los nombres de
las bibliotecas a.out que son cargadas. El uso de esta opción
está fuertemente desaconsejado.
- LDD_ARGV0
- (libc5) argv[0] a ser usado por ldd(1) cuando no hay
ninguno.
- /lib/ld.so
- enlazador/cargador dinámico
- /lib/ld-linux.so.{1,2}
- enlazador/cargador dinámico ELF
- /etc/ld.so.cache
- Fichero que contiene una lista compilada de directorios en los que buscar
biliotecas y una lista ordenada de bibliotecas candidatas.
- /etc/ld.so.preload
- Fichero que contiene una lista de bibliotecas compartidas ELF separadas
por blancos que son cargadas antes que el programa.
- lib*.so*
- bibliotecas compartidas
La funcionalidad ld.so está disponible para
ejecutables compilados usando la versión 4.4.3 de libc o posterior.
La funcionalidad ELF está disponible desde la versión 1.1.52
de Linux y libc5.