Ldd es una utilidad de línea de comandos de Linux que se utiliza en caso de que un usuario desee conocer las dependencias de la biblioteca compartida de un ejecutable o incluso la de una biblioteca compartida. Es posible que haya notado muchos archivos que comienzan con lib * en los directorios / lib y / usr / lib de su máquina Linux. Estos archivos se denominan bibliotecas. La biblioteca es una colección de recursos como subrutinas / funciones, clases, valores o especificaciones de tipo.
Una biblioteca hace posible que un programa use rutinas comunes sin la sobrecarga administrativa de mantener su código fuente, o la sobrecarga de procesamiento de compilarlos cada vez que se compila el programa.
Hay dos tipos de bibliotecas:
Bibliotecas estáticas: Bibliotecas estáticas para programas completos que no dependen de bibliotecas externas para ejecutarse. La característica de los programas vinculados estáticamente es que funcionan sin instalar ningún requisito previo. La biblioteca estática termina con *.a
extensión y estas bibliotecas se incluyen (una copia separada) en los programas que requieren sus funciones.
Bibliotecas dinámicas: bibliotecas dinámicas para programas pequeños en tamaño, estas bibliotecas terminan con .so
extensión, otra característica del uso de enlaces dinámicos cuando se ejecutan muchos programas. Puede compartir una copia de una biblioteca en lugar de ocupar memoria con muchas copias del mismo código. Entonces, los programas recientes usan enlaces dinámicos. En este artículo, repasaremos los comandos. ldd
que se utiliza para administrar las bibliotecas compartidas.
Bibliotecas compartidas
Cuando creamos un programa, necesitamos muchas piezas de código que alguien más ya ha escrito para realizar funciones de rutina o especializadas por nosotros. Estos fragmentos de código se almacenan en bibliotecas compartidas. Para usarlos, los vinculamos con nuestro código, ya sea cuando construimos el programa o cuando lo ejecutamos.
Sintaxis y opciones del comando LDD
El comando ldd imprime dependencias de objetos compartidos. La sintaxis del comando es:
ldd [OPTION]... FILE...
Podemos usar interruptores de comando ldd que se pueden insertar en el
[OPTION] spot en el comando anterior:
- -v: Imprime toda la información.
- -d: reubicación de datos de proceso.
- -r: datos de proceso y reubicación de funciones.
- -u: imprime las dependencias directas no utilizadas.
Tenga en cuenta los siguientes puntos antes de ejecutar el comando:
– El archivo, ld-linux.so es el enlazador o cargador dinámico que busca el enlace deseado o la memoria caché de la biblioteca para el programa solicitado y lo carga.
– El archivo de caché, /etc/ld.so.cache contiene una lista de bibliotecas que se encuentran en los directorios especificados en /etc/ld.so.conf. Esto ayuda a proporcionar enlaces dinámicos más rápidos.
– El archivo /etc/ld.so.conf especifica los directorios donde buscar bibliotecas
1) Mostrar dependencias del comando
Mostraremos las dependencias del comando cp.
$ ldd /bin/cp
Output:
linux-vdso.so.1 => (0x00007fffaf3ff000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a06a00000)
librt.so.1 => /lib64/librt.so.1 (0x0000003a06200000)
libacl.so.1 => /lib64/libacl.so.1 (0x0000003a13000000)
libattr.so.1 => /lib64/libattr.so.1 (0x0000003a0ea00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003a05200000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003a05a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a04a00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a05600000)
2) Mostrar las dependencias del comando con detalles
Mostraremos las dependencias de cp
comando con más detalles usando -v
opción.
$ ldd -v /bin/cp
Output:
linux-vdso.so.1 => (0x00007fff473ff000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a06a00000)
librt.so.1 => /lib64/librt.so.1 (0x0000003a06200000)
libacl.so.1 => /lib64/libacl.so.1 (0x0000003a13000000)
libattr.so.1 => /lib64/libattr.so.1 (0x0000003a0ea00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003a05200000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003a05a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a04a00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a05600000)
Version information:
/bin/cp:
librt.so.1 (GLIBC_2.2.5) => /lib64/librt.so.1
libattr.so.1 (ATTR_1.1) => /lib64/libattr.so.1
libacl.so.1 (ACL_1.2) => /lib64/libacl.so.1
libacl.so.1 (ACL_1.0) => /lib64/libacl.so.1
libc.so.6 (GLIBC_2.6) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libselinux.so.1:
libdl.so.2 (GLIBC_2.2.5) => /lib64/libdl.so.2
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.8) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/librt.so.1:
libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
libpthread.so.0 (GLIBC_PRIVATE) => /lib64/libpthread.so.0
libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
/lib64/libacl.so.1:
libattr.so.1 (ATTR_1.0) => /lib64/libattr.so.1
libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libattr.so.1:
libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libc.so.6:
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
/lib64/libdl.so.2:
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libpthread.so.0:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
3) Mostrar dependencias directas no utilizadas del comando
Podemos mostrar dependencias directas no utilizadas de cp
comando usando -u
opción.
$ ldd -u /bin/cp
Output:
Unused direct dependencies:
/lib64/libselinux.so.1
/lib64/librt.so.1
/lib64/libacl.so.1
/lib64/libattr.so.1
4) Display ldd solo funciona en ejecutables dinámicos
Nosotros mostraremos ldd
funciona solo en ejecutables dinámicos usando -r
opción.
$ ldd -r /smart/pycharm-community-2017.3.3/bin/pycharm.sh
Output:
not a dynamic executable
La salida mostró un mensaje claro que indica que el archivo proporcionado no es un ejecutable dinámico.
5) ldd con ejecutable de línea de comando estándar
Cuando lo intentamos ldd
en un ejecutable de línea de comando estándar como ls
Necesitamos la ruta completa al ejecutable dinámico.
$ ldd ls
Output:
ldd: ./ls: No such file or directory
Vemos eso ldd
afirma que no puede encontrar ls
.
$ ldd /bin/ls
Output:
linux-vdso.so.1 => (0x00007fff5cbea000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a06a00000)
librt.so.1 => /lib64/librt.so.1 (0x0000003a06200000)
libcap.so.2 => /lib64/libcap.so.2 (0x0000003a07600000)
libacl.so.1 => /lib64/libacl.so.1 (0x0000003a13000000)
libc.so.6 => /lib64/libc.so.6 (0x0000003a05200000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003a05a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a04a00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a05600000)
libattr.so.1 => /lib64/libattr.so.1 (0x0000003a0ea00000)
Pero con el camino absoluto ldd
funcionó bien.
6) Sepa que un demonio ejecutable dado es compatible con TCP Wrapper
Para determinar si un demonio ejecutable dado es compatible con TCP Wrapper o no, ejecute el siguiente comando.
$ sudo ldd /usr/sbin/sshd | grep libwrap
Output:
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f1cc2ac6000)
La salida indica que el demonio de OpenSSH (sshd) es compatible con TCP Wrapper.
7) ldd con dependencia faltante
Podemos usar el ldd
comando cuando un ejecutable falla debido a una dependencia faltante. Una vez que encontramos una dependencia faltante, podemos instalarla o actualizar la caché con el ldconfig
mando.
$ sudo ldd /bin/mv
libacl.so.1 => /lib/libacl.so.1 (0×40016000)
libc.so.6 => /lib/libc.so.6 (0x4001c000)
libattr.so.1 => /lib/libattr.so.1 (0×40141000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0×40000000)
Realizaremos reubicaciones e informaremos cualquier objeto faltante (solo ELF) escribiendo el comando a continuación.
$ sudo ldd -d path/to/executable_file
Realizaremos reubicaciones tanto para los objetos de datos como para las funciones, e informaremos sobre cualquier objeto o función que falte (solo ELF) escribiendo el siguiente comando.
$ sudo ldd -r path/to/executable_file
Errores comunes relacionados con la biblioteca compartida
1) Error de biblioteca faltante
Puede encontrar un error de biblioteca faltante a pesar de que las bibliotecas mencionadas están disponibles en la nueva ruta de instalación “/ opt / newinstall / lib”. Esto se debe a que el sistema no conoce este directorio para buscar bibliotecas. Esto se puede solucionar de cualquiera de las dos formas.
una. Ejecute el siguiente comando,
$ ldconfig -n /opt/newinstall/lib
B. Puede ver la siguiente línea de inclusión en el archivo /etc/ld.so.conf:
incluir ld.so.conf.d / *. conf
Entonces, cree un archivo en la carpeta /etc/ld.so.sonf.d, diga newinstall.conf con el siguiente contenido.
/opt/newinstall/lib
Luego, ejecuta:
$ ldconfig
2) Error del vinculador dinámico, no se pueden asignar archivos de caché
Esto puede deberse a que el archivo de caché está dañado. Esto se puede resolver reconstruyendo el archivo de caché usando ldconfig.
$ ldconfig
Comando ldconfig
ldconfig crea los enlaces y la caché necesarios (para que los use el vinculador en tiempo de ejecución, ld.so) a las bibliotecas compartidas más recientes que se encuentran en los directorios especificados en la línea de comandos, en el archivo /etc/ld.so.conf, y en los directorios de confianza (/ usr / lib y / lib).
Por ejemplo:
Ejecute el siguiente comando para configurar los enlaces correctos para los binarios compartidos y reconstruir la caché.
$ ldconfig –v
Ejecute el siguiente comando después de la instalación de una nueva biblioteca compartida que actualizará correctamente los enlaces simbólicos de la biblioteca compartida en / lib.
$ ldconfig -n /lib
El siguiente comando imprimirá el caché actual.
$ ldconfig -p
Conclusión
En este tutorial aprendimos cómo usar el comando ldd y cómo usarlo en la línea de comandos de Linux. Espero que hayas disfrutado leyendo este tutorial y avisa si tienes alguna sugerencia.
Leer también:
- 8 Comando Tee de Linux con ejemplos
- Cómo usar el comando Tr de Linux con ejemplos