Comando ldd de Linux
Guía completa de comandos de Linux
ldd (List Dynamic Dependencies) es una herramienta de línea de comandos muy útil en sistemas Linux, utilizada para mostrar las bibliotecas de enlace dinámico de las que dependen un programa o una biblioteca compartida. Cuando ejecutas un programa en Linux, el sistema necesita cargar varias bibliotecas compartidas (archivos .so) de las que depende el programa; ldd es la herramienta que se usa para ver estas relaciones de dependencia.
Sintaxis básica del comando ldd
ldd [选项] 可执行文件或共享库
Descripción de opciones y parámetros comunes
| Opción | Descripción |
|---|---|
| -v | Muestra información detallada de la versión |
| -u | Muestra las dependencias directas no utilizadas |
| -d | Realiza la reubicación e informa sobre las funciones faltantes |
| -r | Realiza la reubicación e informa sobre funciones y datos faltantes |
| --help | Muestra la información de ayuda |
Cómo funciona el comando ldd
ldd en realidad es un script que ejecuta el programa objetivo estableciendo variables de entorno especiales, de modo que el programa muestre la información de las bibliotecas de las que depende al cargarse, en lugar de ejecutarse normalmente. Específicamente:
- Para archivos ejecutables en formato ELF, ldd analiza su segmento dinámico (dynamic segment)
- Comprueba las entradas DT_NEEDED para determinar las bibliotecas compartidas necesarias
- Busca estos archivos de biblioteca en las rutas de bibliotecas del sistema
- Muestra la ruta completa y la asignación de direcciones de memoria de cada biblioteca
Ejemplos de uso
Ejemplo 1: Ver las dependencias de un programa simple
ldd /bin/ls
Salida típica:
linux-vdso.so.1 (0x00007ffd5a3f0000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f8e4a3b0000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8e4a1c0000) libpcre2-8.so.0 => /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f8e4a130000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8e4a120000) /lib64/ld-linux-x86-64.so.2 (0x00007f8e4a400000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8e4a100000)
Ejemplo 2: Comprobar dependencias directas no utilizadas
ldd -u /usr/bin/python3
Ejemplo 3: Ver dependencias en modo detallado
ldd -v /usr/bin/gcc
Escenarios de aplicación práctica
Escenario 1: Resolver el error "library not found"
Cuando un programa no puede ejecutarse por falta de una biblioteca, ldd puede ayudar a localizar rápidamente el problema:
ldd ./my_program | grep "not found"
Escenario 2: Comprobar conflictos de versiones de bibliotecas
ldd -r ./my_program
Escenario 3: Verificar si la ruta de la biblioteca es correcta
ldd /path/to/your/executable | awk '{print $3}' | xargs ls -la
Precauciones y preguntas frecuentes
-
Advertencia de seguridad: No uses ldd con archivos ejecutables no confiables, porque en realidad intentará ejecutar parte del código del programa
- Alternativas:
objdump -p /path/to/program | grep NEEDED
- Alternativas:
-
Programas de enlace estático: Para programas completamente enlazados estáticamente, ldd mostrará "not a dynamic executable"
-
Entorno de compilación cruzada: En entornos de compilación cruzada, es necesario utilizar la herramienta ldd de la plataforma correspondiente
-
Errores comunes:
ldd: ./program: No such file or directory→ Puede deberse a que falta el intérprete o a que el programa en sí no existeldd: exited with unknown exit code→ El programa podría fallar durante su ejecución
Técnicas avanzadas
1. Combinar con readelf para ver información de dependencias más detallada
readelf -d /path/to/program | grep NEEDED
2. Usar la variable de entorno LD_TRACE_LOADED_OBJECTS
LD_TRACE_LOADED_OBJECTS=1 /path/to/program
3. Examinar el árbol de dependencias de la biblioteca
ldd /path/to/library.so | awk '{print $3}' | xargs ldd
Resumen
ldd es una herramienta indispensable en la administración de sistemas Linux y la depuración de programas; puede:
- Mostrar rápidamente las dependencias de bibliotecas dinámicas de un programa
- Ayudar a resolver problemas de bibliotecas faltantes o conflictos de versiones
- Verificar si el entorno de ejecución del programa está completo
- Asistir en el empaquetado e implementación de software
Dominar el uso del comando ldd puede aumentar en gran medida tu eficiencia para resolver problemas de dependencias en el entorno Linux.
Otras extensiones