【问题标题】:Tool for Library Dependency库依赖工具
【发布时间】:2012-11-21 19:28:25
【问题描述】:

我正在寻找Unix 平台上的tool/command 以检测.so.o 文件的library 依赖项。

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

【问题讨论】:

    标签: unix shared-libraries solaris ldd nm


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了!很好的解释。祝大家好运。
    • 谢谢!!!很好解释,我只需要更多关于 truss 和 nm 用法的信息。
    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    相关资源
    最近更新 更多