【问题标题】:Get list of static libraries used in an executable获取可执行文件中使用的静态库列表
【发布时间】:2010-11-10 14:35:20
【问题描述】:

由于ldd 仅列出动态库,有没有办法提取有关用于创建可执行文件的静态库的信息?

【问题讨论】:

    标签: c++ c unix static linker


    【解决方案1】:

    ldd <exe filename> 显示动态链接库

    nm <exe filename> 显示文件中的符号。

    要查看哪些符号来自静态库,需要针对这些库运行 nm 以获取其中的符号(函数等)列表,然后将它们与来自 nm <exe filename> 的符号列表进行比较。

    您可以使用comm 命令比较列表。详情请见man comm

    本文摘自此论坛here

    【讨论】:

    • 正如@Goz 和anon 指出的那样,这仅在二进制文件没有被剥离/包含调试信息的情况下才有效。将静态库链接到应用程序后,名称就不是必需的(甚至不使用) - 调用都是按地址进行的。
    • 这没有回答问题。如果您不了解这些库,则无法“针对这些库运行 nm”;并且在链接中隐式使用了一些库。
    • 如果它是未知的二进制文件,我们不知道存在哪些库。因此,“针对这些库运行 nm”听起来会弄巧成拙。
    【解决方案2】:

    不,库的名称在链接过程中被丢弃。但是,如果您的可执行文件包含调试信息(即,它是使用 -g 标志编译的),您可能能够从中获取信息。

    【讨论】:

    • 有没有办法辨别 RAW ASM,或者编译器优化和标志也会影响它?
    【解决方案3】:

    如果您有源代码并且不想为此浏览所有代码,您可以在编译时生成映射文件以了解链接了哪些静态库。

    例如g++ -Xlinker -Map=a.map main.c,查看映射文件中链接的静态库信息。

    【讨论】:

      【解决方案4】:

      除非给定的编译器在二进制文件中存储某种元数据,否则不会。静态库是直接编译成二进制的代码。

      【讨论】:

        【解决方案5】:

        无法获取某些ELF 可执行文件中的静态库列表。

        因为对于链接器,静态库只是用作“惰性”成员集。因此,生成的 ELF 可执行文件将仅包含链接它所需的成员。因此,libfoo.afoo2.o 之类的成员被链接起来,就好像目标文件 foo2.o 已链接到可执行文件中一样(前提是需要在 foo2 中定义的某些符号,即在某处引用)。

        当然,在某些 ELF 可执行文件上使用 nmobjdumpreadelfstrings 可能会提示哪些目标文件(包括来自 static 的目标文件库)在其中,因为您会看到在这些静态库(或其中使用的文字字符串)中定义的符号(成员)。

        【讨论】:

        • 你是什么意思?你能举个例子吗?你能指出我可以找到更多这些提示的来源吗?
        • 例如使用 readelf 将向您显示二进制文件中使用的函数、对象、符号。这些可以作为查找使用的库的提示。例如,您可能会在其中看到 Curl_http 函数,并且知道 libcurl 最有可能被二进制文件使用,如果它不是动态链接的,则必须静态链接。跨度>
        猜你喜欢
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-24
        • 2012-04-19
        • 2020-02-11
        • 2014-08-30
        • 2017-03-29
        相关资源
        最近更新 更多