2012-11-21 10 views
11

Ich suche nach dem tool/command auf Unix Plattform, um die library Abhängigkeiten der .so und .o Dateien zu erkennen.Werkzeug für die Bibliothek Abhängigkeit

Ich habe bereits die ldd/nm/truss verwendet, aber ich kenne den richtigen Ansatz zum Erkennen von Bibliotheksabhängigkeiten nicht.

Antwort

16

Es hängt davon ab, was genau bedeutet "Bibliotheksabhängigkeiten erkennen".

Der Befehl ldd funktioniert bei gemeinsam genutzten Bibliotheken, nicht nur bei ausführbaren Dateien. Es werden die Abhängigkeiten von einer gemeinsam genutzten Bibliothek angezeigt werden erklärt, wenn die Bibliothek gebaut wurde:

$ ldd /usr/lib/libgtk-3.so 
    linux-vdso.so.1 (0x00007ffff8fff000) 
    libgdk-3.so.0 => /usr/lib/libgdk-3.so.0 (0x00007f43fcf47000) 
    libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x00007f43fcd43000) 
    libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0x00007f43fcb36000) 
    libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f43fc7fc000) 
... 

Eine Bibliothek kann nicht definierte Symbole, die durch die Verknüpfung mit weiteren Bibliotheken erhalten werden, nicht als Abhängigkeiten deklariert. Sie können objdump -T oder nm -D verwenden, um die dynamischen Symbole zeigen - nicht definiert Symbole (jene, die von anderen Bibliotheken kommen sollten) als *UND* auftauchen wird:

$ objdump -T /usr/lib/libgtk-3.so | head 

/usr/lib/libgtk-3.so:  file format elf64-x86-64 

DYNAMIC SYMBOL TABLE: 
0000000000066e38 l d .init 0000000000000000    .init 
0000000000000000  DF *UND* 0000000000000000    g_param_spec_object 
0000000000000000  DF *UND* 0000000000000000    g_utf8_validate 
0000000000000000  DF *UND* 0000000000000000    g_date_get_month 
0000000000000000  DF *UND* 0000000000000000    g_bookmark_file_get_visited 
0000000000000000  DF *UND* 0000000000000000    g_value_get_float 

Aus diesen Symbolnamen sollte es möglich sein, die nicht angemeldete Bibliothek Abhängigkeiten abzuleiten.

Bibliotheken, die pkg-config oder ähnliche Konfigurationsmechanismen verwenden, können ihre Abhängigkeiten manchmal nicht zur Build-Zeit deklarieren, aber die Abhängigkeiten zu pkg-config deklarieren und sich darauf verlassen, dass die Bibliotheksbenutzer das Tool zum Abrufen der Abhängigkeiten verwenden. pkg-config --libs listet die Abhängigkeiten in dem vom Compiler verstandenen Format auf:

$ pkg-config --libs gtk+-3.0 
-lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 
+0

bravo! gut erklärt. Viel Glück für jeden. – shellter

+0

Danke !!! Gut erklärt, ich brauche nur ein paar mehr Informationen über die Verwendung von Fachwerk und nm. –

Verwandte Themen