LINUX

8 ejemplos de comandos LDD en Linux

Comando LDD Linux

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 lsNecesitamos 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 admite 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) admite 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 aunque 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 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:

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar