GNU/Linux >> Tutoriels Linux >  >> Linux

8 exemples de commandes LDD sous Linux

Ldd est un utilitaire de ligne de commande Linux qui est utilisé dans le cas où un utilisateur souhaite connaître les dépendances de bibliothèque partagée d'un exécutable ou même celles d'une bibliothèque partagée. Vous avez peut-être remarqué de nombreux fichiers commençant par lib* dans les répertoires /lib et /usr/lib de votre machine Linux. Ces fichiers sont appelés bibliothèques. La bibliothèque est une collection de ressources telles que des sous-routines/fonctions, des classes, des valeurs ou des spécifications de type.

Une bibliothèque permet à un programme d'utiliser des routines communes sans la surcharge administrative liée à la maintenance de leur code source, ni la surcharge de traitement liée à leur compilation à chaque fois que le programme est compilé.

Il existe deux types de bibliothèques :

Bibliothèques statiques : des bibliothèques statiques pour des programmes complets qui ne dépendent pas de bibliothèques externes pour s'exécuter. La caractéristique des programmes liés statiquement est qu'ils fonctionnent sans installer de prérequis. La bibliothèque statique se termine par *.a extension et ces bibliothèques sont incluses (une copie séparée) dans les programmes qui nécessitent ses fonctions.

Bibliothèques dynamiques : bibliothèques dynamiques pour les programmes de petite taille, ces bibliothèques se terminent par .so extension, Une autre caractéristique de l'utilisation de la liaison dynamique lorsque de nombreux programmes sont en cours d'exécution, Il peut partager une copie d'une bibliothèque plutôt que d'occuper de la mémoire avec plusieurs copies du même code. Ainsi, les programmes récents utilisent des liens dynamiques. Dans cet article, nous allons passer en revue les commandes ldd qui est utilisé pour gérer les bibliothèques partagées.

Bibliothèques partagées

Lorsque nous créons un programme, nous avons besoin de nombreux morceaux de code que quelqu'un d'autre a déjà écrits pour exécuter des fonctions de routine ou spécialisées pour nous. Ces morceaux de code sont stockés dans des bibliothèques partagées. Pour les utiliser, nous les lions avec notre code, soit lorsque nous construisons le programme, soit lorsque nous exécutons le programme.

Syntaxe et options de la commande LDD

La commande ldd imprime les dépendances d'objets partagés. La syntaxe de la commande est :

ldd [OPTION]... FILE...

Nous pouvons utiliser des commutateurs de commande ldd qui peuvent être insérés dans le
[OPTION] spot dans la commande ci-dessus :

  • -v :imprime toutes les informations.
  • -d :traiter la relocalisation des données.
  • -r :traiter les données et relocaliser les fonctions.
  • -u :affiche les dépendances directes inutilisées.

Veuillez noter les points suivants avant de passer la commande :

- Le fichier, ld-linux.so est l'éditeur de liens ou chargeur dynamique qui recherche le lien ou le cache de bibliothèque souhaité pour le programme demandé et le charge.

- Le fichier cache, /etc/ld.so.cache contient une liste des bibliothèques trouvées dans les répertoires spécifiés dans /etc/ld.so.conf. Cela permet de fournir des liens dynamiques plus rapides.

- Le fichier /etc/ld.so.conf spécifie les répertoires où rechercher les bibliothèques

1) Afficher les dépendances de la commande

Nous allons afficher les dépendances de la commande 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) Afficher les dépendances de la commande avec des détails

Nous allons afficher les dépendances de cp commande avec plus de détails en utilisant -v option.

$ 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) Afficher les dépendances directes inutilisées de la commande

Nous pouvons afficher les dépendances directes inutilisées de cp commande utilisant -u option.

$ 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) L'affichage ldd ne fonctionne que sur les exécutables dynamiques

Nous afficherons ldd fonctionne uniquement sur les exécutables dynamiques en utilisant -r option.

$  ldd -r /smart/pycharm-community-2017.3.3/bin/pycharm.sh
    Output:
     not a dynamic executable

La sortie affichait un message clair indiquant que le fichier fourni n'est pas un exécutable dynamique.

5) ldd avec un exécutable standard en ligne de commande

Lorsque nous essayons ldd sur une ligne de commande standard exécutable comme ls , Nous avons besoin du chemin complet vers l'exécutable dynamique.

$ ldd ls
    Output:
    ldd: ./ls: No such file or directory

Nous voyons que ldd indique qu'il ne peut pas trouver 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)

Mais avec le chemin absolu, ldd a bien fonctionné.

6) Savoir qu'un démon exécutable donné prend en charge TCP Wrapper

Pour déterminer si un démon exécutable donné prend en charge TCP Wrapper ou non, exécutez la commande suivante.

$ sudo ldd /usr/sbin/sshd | grep libwrap
    Output:
    libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f1cc2ac6000)

La sortie indique que le démon OpenSSH (sshd) prend en charge TCP Wrapper.

7) ldd avec dépendance manquante

Nous pouvons utiliser le ldd lorsqu'un exécutable échoue en raison d'une dépendance manquante. Une fois que nous avons trouvé une dépendance manquante, nous pouvons l'installer ou mettre à jour le cache avec le ldconfig commande.

$ 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)

Nous effectuerons des relocalisations et signalerons tout objet manquant (ELF uniquement) en tapant la commande ci-dessous.

$ sudo ldd -d path/to/executable_file

Nous effectuerons des déplacements pour les objets de données et les fonctions, et signalerons tout objet ou fonction manquant (ELF uniquement) en tapant la commande ci-dessous.

$ sudo ldd -r path/to/executable_file

Erreurs courantes liées à la bibliothèque partagée

1) Erreur de bibliothèque manquante

Vous pouvez rencontrer une erreur de bibliothèque manquante même si les bibliothèques mentionnées sont disponibles dans le nouveau chemin d'installation "/opt/newinstall/lib". C'est parce que le système n'a pas connaissance de ce répertoire pour vérifier les bibliothèques. Cela peut être résolu de l'une des deux manières.

un. Exécutez la commande suivante,

$ ldconfig -n /opt/newinstall/lib

b. Vous pouvez voir la ligne d'inclusion suivante dans le fichier /etc/ld.so.conf :

inclure ld.so.conf.d/*.conf

Donc, créez un fichier dans le dossier /etc/ld.so.sonf.d, dites newinstall.conf avec le contenu suivant.

/opt/newinstall/lib

Ensuite, exécutez :

$ ldconfig

2) Erreur de l'éditeur de liens dynamique, impossible de mapper les fichiers de cache

Cela peut être dû au fichier cache corrompu. Cela peut être résolu en reconstruisant le fichier cache à l'aide de ldconfig.

$ ldconfig

Commande ldconfig

ldconfig crée les liens et le cache nécessaires (pour une utilisation par l'éditeur de liens d'exécution, ld.so) vers les bibliothèques partagées les plus récentes trouvées dans les répertoires spécifiés sur la ligne de commande, dans le fichier/etc/ld.so.conf, et dans les répertoires de confiance (/usr/lib et /lib).

Par exemple :

Exécutez la commande suivante pour configurer les liens corrects pour les fichiers binaires partagés et reconstruire le cache.

$ ldconfig –v

Exécutez la commande suivante une fois que l'installation d'une nouvelle bibliothèque partagée mettra correctement à jour les liens symboliques de la bibliothèque partagée dans /lib.

$ ldconfig -n /lib

La commande suivante imprimera le cache actuel.

$ ldconfig -p

Conclusion

Dans ce didacticiel, nous avons appris à utiliser la commande ldd et à utiliser la ligne de commande linux. J'espère que vous avez apprécié la lecture de ce didacticiel et n'hésitez pas à nous faire part de vos suggestions.

Lire aussi :

  • 8 commandes Tee Linux avec exemples
  • Comment utiliser la commande Linux Tr avec des exemples

Linux
  1. Commande JQ sous Linux avec exemples

  2. Exemples de commandes sa sous Linux

  3. ac Exemples de commandes sous Linux

  4. Exemples de commandes df sous Linux

  5. du Exemples de commandes sous Linux

9 exemples de commandes tee sous Linux

9 exemples de commande diff sous Linux

Commande Linux ip avec exemples

La commande Linux ldd expliquée avec des exemples

15 Commande Linux ps avec exemples

Exemples de commandes id sous Linux