Mit dem Kommando ldd können Sie ermitteln, welche Bibliotheken die als Argument angegebene dynamische Programmdatei laden würde.
tux@mercury:~> ldd /bin/ls linux-vdso.so.1 => (0x00007fff1ddff000) librt.so.1 => /lib64/librt.so.1 (0x00007f1315993000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f1315776000) libacl.so.1 => /lib64/libacl.so.1 (0x00007f131556e000) libc.so.6 => /lib64/libc.so.6 (0x00007f1315215000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f1314ff9000) /lib64/ld-linux-x86-64.so.2 (0x00007f1315b9c000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f1314df5000) libattr.so.1 => /lib64/libattr.so.1 (0x00007f1314bf0000)
Statische Binärdateien benötigen keine dynamischen Bibliotheken.
tux@mercury:~> ldd /sbin/ldconfig not a dynamic executable tux@mercury:~> file /bin/sash /sbin/ldconfig: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for \ GNU/Linux 2.6.4, statically linked, stripped
Mit dem Befehl ltrace können Sie die Bibliotheksaufrufe eines Prozesses verfolgen. Dieser Befehl wird auf ähnliche Weise verwendet wie strace. Der Parameter -c gibt die Anzahl und die Dauer der erfolgten Bibliotheksaufrufe aus:
tux@mercury:~> ltrace -c find ~ seconds usecs/call calls function ------ ----------- ----------- --------- -------------------- 57.49 40.170338 1580 25411 __fprintf_chk 11.50 8.036963 237 33894 readdir 7.18 5.019464 98 50822 __ctype_get_mb_cur_max 6.02 4.206130 767 5480 fchdir 3.30 2.304577 209 11022 malloc 3.18 2.224551 406 5479 __open_2 [...] 0.00 0.000025 25 1 __cxa_atexit ------ ----------- ----------- --------- -------------------- 100.00 69.878004 363666 total
Mit dem Dienstprogramm strace können Sie alle Systemaufrufe eines aktuell ausgeführten Prozesses verfolgen. Jede Ausgabezeile des Kommandos enthält den Systemaufrufnamen, gefolgt von seinen Argumenten in Klammern und seinem Rückgabewert. Geben Sie den Befehl wie üblich ein und fügen Sie am Zeilenanfang strace hinzu:
tux@mercury:~> strace ls execve("/bin/ls", ["ls"], [/* 52 vars */]) = 0 brk(0) = 0x618000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) \ = 0x7f9848667000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) \ = 0x7f9848666000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=200411, ...}) = 0 mmap(NULL, 200411, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f9848635000 close(3) = 0 open("/lib64/librt.so.1", O_RDONLY) = 3 [...] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) \ = 0x7f9848508000 write(1, "bin\nDesktop\nDocuments\n", 22bin Desktop Documents ) = 22 close(1) = 0 munmap(0x7f9848508000, 4096) = 0 close(2) = 0 exit_group(0)
Um beispielsweise alle Versuche, eine bestimmte Datei zu öffnen, zu verfolgen, geben Sie Folgendes ein:
tux@mercury:~> strace -e open ls .bashrc open("/etc/ld.so.cache", O_RDONLY) = 3 open("/lib64/librt.so.1", O_RDONLY) = 3 open("/lib64/libselinux.so.1", O_RDONLY) = 3 open("/lib64/libacl.so.1", O_RDONLY) = 3 open("/lib64/libc.so.6", O_RDONLY) = 3 open("/lib64/libpthread.so.0", O_RDONLY) = 3 [...]
Um alle untergeordneten Prozesse zu verfolgen, verwenden Sie den Parameter -f. Das Verhalten und das Ausgabeformat von strace können weitgehend gesteuert werden. Weitere Informationen erhalten Sie durch die Eingabe von man strace.