NOMBRE¶
ld.so, ld-linux.so* - enlazador/cargador dinámico
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:
- 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.
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.
VÉASE TAMBIÉN¶
ldd(1),
ldconfig(8)