我在tool
平台上寻找command
/ Unix
来检测library
和.so
文件的.o
依赖关系
我已经使用了ldd
/ nm
/ truss
,但我不知道检测库依赖关系的正确方法。
答案 0 :(得分:18)
这取决于“检测库依赖性”的确切含义。
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 -T
或nm -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-config
,依赖库用户使用该工具来获取依赖项。 pkg-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