ld-linux.so*(8) enlazador/cargador dinámico

Other Alias

ld.so

DESCRIPCIÓN

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:

  • (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.
  • Usando la variable de entorno LD_LIBRARY_PATH, salvo cuando el ejecutable tiene activo el bit setuid/setgid, en cuyo caso se ignora.
  • (sólo para ELF) Usando el atributo dinámico de sección DT_RUNPATH del binario si está presente.
  • 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.
  • 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.

SINOPSIS

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]]

OPCIONES DE LA LÍNEA DE ÓRDENES

--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

ENTORNO

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.

FICHEROS

/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

OBSERVACIONES

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.