0

comment afficher les bibliothèques partagées nécessaires à un programme et vice versa

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

source

Partager l'article :





fred

"Dire que l'on s'en fiche du droit à la vie privée sous prétexte qu'on a rien à cacher, c'est comme déclarer que l'on se fiche du droit à la liberté d'expression sous prétexte qu'on a rien à dire." Edward Snowden

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.