Dans le cas de la compilation d’un programme, il est utile de connaître les bibliothèques partagés nécessaires à ce programme. Sous GNU/Linux il existe une commande: ldd, mais son contraire n’existe pas nativement.
Pour connaître les programmes, qui dépendent de telle ou telle bibliothèque, on utilisera une script nommé: reverse_ldd.sh.
Commande ldd
La commande ldd est très simple d’utilisation.
Exemple avec le programme sSMTP:
ldd /usr/sbin/ssmtp linux-vdso.so.1 => (0x00007fff5650f000) libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f2aba48c000) libgnutls-openssl.so.27 => /usr/lib/x86_64-linux-gnu/libgnutls-openssl.so.27 (0x00007f2aba280000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2ab9ef5000) libtasn1.so.3 => /usr/lib/x86_64-linux-gnu/libtasn1.so.3 (0x00007f2ab9ce4000) libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f2ab9ad2000) libgnutls.so.26 => /usr/lib/x86_64-linux-gnu/libgnutls.so.26 (0x00007f2ab9811000) /lib64/ld-linux-x86-64.so.2 (0x00007f2aba6ac000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2ab960d000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2ab93f1000) libgcrypt.so.11 => /lib/x86_64-linux-gnu/libgcrypt.so.11 (0x00007f2ab9172000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2ab8f5b000) libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f2ab8d58000)
Il est possible de cumuler plusieurs programmes à la suite de la commande ldd.
Exemple avec les programmes wget et updatedb
ldd /usr/bin/wget /usr/bin/updatedb /usr/bin/wget: linux-vdso.so.1 => (0x00007fff84dff000) libgnutls.so.26 => /usr/lib/x86_64-linux-gnu/libgnutls.so.26 (0x00007f1f0d4e3000) libgcrypt.so.11 => /lib/x86_64-linux-gnu/libgcrypt.so.11 (0x00007f1f0d265000) libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f1f0d061000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f1f0ce4a000) libidn.so.11 => /usr/lib/x86_64-linux-gnu/libidn.so.11 (0x00007f1f0cc16000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f1f0ca0d000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1f0c683000) libtasn1.so.3 => /usr/lib/x86_64-linux-gnu/libtasn1.so.3 (0x00007f1f0c472000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1f0c255000) libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f1f0c043000) /lib64/ld-linux-x86-64.so.2 (0x00007f1f0d7ab000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1f0be3e000) /usr/bin/updatedb: linux-vdso.so.1 => (0x00007fff7b7df000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fec2b281000) /lib64/ld-linux-x86-64.so.2 (0x00007fec2b613000)
Pour en savoir plus sur la commande ldd:
ldd --help Usage : ldd [OPTION]... FILE... --help affiche cette aide et quitte --version affiche les informations de version et quitte -d, --data-relocs réaffecte les données de processus -r, --function-relocs réaffecte les données de processus et les fonctions -u, --unused affiche les dépendances directes non utilisées -v, --verbose affiche toutes les informations
ou bien:
man ldd
L’inverse de la commande ldd
Pour pouvoir afficher, qui dépend de telle ou telle bibliothèques, voici un scripte sous licence GPLv2 écrit par tiky :
#!/bin/bash ######################################################################### # Filename : reverse_ldd.sh # # Date : 16/09/2008 # # Author : tiky (forum ubuntu-fr.org, post 252571) # # License : GPLv2 # # Description : search programs that use a specific library # # -> use in root if possible # # Example : $ ./reverse_ldd.sh libSDL-1.2.so.0 # # /usr/bin/yuvplay # # /usr/bin/kvm # # /usr/bin/glmovie # # /usr/bin/y4mhist # # /usr/bin/showimage # # /usr/bin/lavplay # # /usr/bin/plaympeg # # /usr/games/bin/exploder # # /usr/games/bin/cutter # # /usr/games/bin/wesnoth # # /usr/games/bin/wesnoth_editor # ######################################################################### ######### Functions ######### function usage() { echo "usage: $0 library_filename" && exit 1 } ######## Input tests ######## if [ $# -ne 1 ]; then usage fi ### Variables declaration ### ld=$1 dirs=(`echo $PATH | sed -e "s/:/ /g"`) files=(`find ${dirs[*]} -executable -type f`) ########### Core ############ for file in ${files[*]} do so=(`ldd $file 2> /dev/null | awk '{print $1}'`) for s in ${so[*]} do if [ $s = $ld ]; then echo $file fi done done exit 0
Exemple d’utilisation du scripte:
./reverse_ldd.sh libwrap.so.0 /usr/sbin/try-from /usr/sbin/tcpdmatch /usr/sbin/tcpdchk /usr/sbin/mysqld /usr/sbin/rpcinfo /usr/sbin/tcpd /usr/sbin/sshd /sbin/rpcbind /sbin/rpc.statd