unix - 库依赖工具

标签 unix shared-libraries solaris ldd nm

我在找 tool/commandUnix平台检测library .so 的依赖关系和 .o文件。

我已经用过 ldd/nm/truss ,但我不知道检测库依赖项的正确方法。

最佳答案

这取决于“检测库依赖项”的确切含义。

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

库可以具有 undefined symbol ,这些符号是通过与未声明为依赖项的其他库链接而获得的。您可以使用 objdump -T nm -D 显示动态符号 - undefined symbol (那些应该来自其他库的符号)将显示为 *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  

关于unix - 库依赖工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13500658/

相关文章:

UNIX:如何将所有隐藏文件夹/文件更改为在目录中可见

c++ - 共享库错误为 "invalid conversion"从 void * 到 double(*) (int*)?

c++ - solaris (x86) 上std::basic_string 的一些疑惑

linux - 使用 shell 脚本检查 EOF

linux - 在 Ubuntu 终端中禁用自动换行

java - 从已编译的类中推断出公开可用的 Java 代码的版本

android - 如何使我的 JAR 库包含在 AndroidManifest.xml 的 <uses-library> 中并将其用作共享库

ssl - wget 命令 SSL3_CHECK_CERT_AND_ALGORITHM :dh key too small 有问题

linux - 如何在 Oracle Solaris 11.2 x86 和 CentOS 6.6 Final 上安装 gcc 6.x?

unix - SSH key 映射到用户