Comando ldd de Linux

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:

  1. Para archivos ejecutables en formato ELF, ldd analiza su segmento dinámico (dynamic segment)
  2. Comprueba las entradas DT_NEEDED para determinar las bibliotecas compartidas necesarias
  3. Busca estos archivos de biblioteca en las rutas de bibliotecas del sistema
  4. 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

  1. 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
  2. Programas de enlace estático: Para programas completamente enlazados estáticamente, ldd mostrará "not a dynamic executable"

  3. Entorno de compilación cruzada: En entornos de compilación cruzada, es necesario utilizar la herramienta ldd de la plataforma correspondiente

  4. 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 existe
    • ldd: 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.


Linux 命令大全Guía completa de comandos de Linux

Otras extensiones