GNU/Linux >> Tutoriales Linux >  >> Linux

8 ejemplos de comandos LDD en 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 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 necesidad de 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 la 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 para 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
[OPCIÓN] lugar 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.

Anote los siguientes puntos antes de pasar por el comando:

- El archivo, ld-linux.so es el enlazador o cargador dinámico que busca el enlace deseado o el 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) Muestra 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) Mostrar ldd solo funciona en ejecutables dinámicos

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

El resultado 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 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 que ldd indica 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 la ruta absoluta, ldd funcionó bien.

6) Saber que un demonio ejecutable dado es compatible con TCP Wrapper

Para determinar si un demonio ejecutable determinado 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)

El resultado indica que el demonio OpenSSH (sshd) admite TCP Wrapper.

7) ldd sin dependencia

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 el caché con ldconfig comando.

$ 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 que falte (solo ELF) escribiendo el siguiente comando.

$ sudo ldd -d path/to/executable_file

Realizaremos reubicaciones tanto para objetos de datos como para funciones, y reportaremos 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

Es posible que encuentre 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 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, digamos newinstall.conf con el siguiente contenido.

/opt/newinstall/lib

Luego, ejecuta:

$ ldconfig

2) Error del enlazador 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 memoria caché necesarios (para que los use el enlazador 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 comando, 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 el caché.

$ ldconfig –v

Ejecute el siguiente comando después de que la instalación de una nueva biblioteca compartida actualice 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 por favor avísanos si tienes alguna sugerencia.

Leer también:

  • 8 Comando Tee de Linux con ejemplos
  • Cómo usar el comando Tr de Linux con ejemplos

Linux
  1. Comando JQ en Linux con ejemplos

  2. 7 ejemplos de comandos Linux df

  3. 8 ejemplos de comandos TR de Linux

  4. Ejemplos de comandos rm en Linux

  5. Ejemplos de comandos ps en Linux

9 ejemplos de comandos tee en Linux

9 ejemplos de comandos diff en Linux

Comando ip de Linux con ejemplos

Comando ldd de Linux explicado con ejemplos

15 comandos ps de Linux con ejemplos

Ejemplos de comandos id en Linux