2012-11-21 45 views
11

我正在尋找的tool/commandUnix平臺檢測.so.o文件的library依賴性。工具庫的依賴

我已經使用了ldd/nm/truss,但我不知道檢測庫依賴關係的正確方法。

回答

16

這取決於「檢測庫依賴性」究竟意味着什麼。

ldd命令適用於共享庫,而不僅僅是可執行文件。它將顯示圖書館建當共享庫的依賴性聲明:

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

阿庫可以具有由與未聲明爲依賴關係進一步庫鏈接獲得的未定義的符號。您可以使用objdump -Tnm -D來顯示動態符號 - 未定義的符號(那些應該來自其他庫)將顯示爲*UND*

$ 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 

從這些符號名稱應該可以推斷出未申報庫的依賴。

使用pkg-config或類似配置機制的庫有時無法在構建時聲明它們的依賴關係,而是依賴於庫用戶使用該工具來獲取依賴關係,從而聲明依賴關係爲pkg-configpkg-config --libs將以編譯器所理解的格式列出相關性:

$ 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!很好地解釋。祝你們好運。 – shellter

+0

謝謝!很好解釋,我只需要關於桁架和nm的使用的更多信息。 –