获取可执行文件中使用的静态库列表。

72

ldd 仅列出动态库,那么是否有方法提取用于创建可执行文件的静态库信息?

5个回答

80

ldd <exe文件名> 显示动态链接库。

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

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

您可以使用 comm 命令来比较列表。有关详细信息,请参见 man comm

这段内容摘自这里的论坛帖子。


4
正如@Goz和匿名用户指出的那样,这仅适用于二进制文件未被剥离或包含调试信息的情况。在静态库链接到应用程序后,名称不是必要的(甚至没有使用)- 所有调用都是通过地址进行的。 - nobody
5
这并没有回答问题。如果你不知道这些库,那么“使用nm命令运行这些库”是不可能的;而且链接时会隐含地使用一些库。 - kavadias
2
如果是未知的二进制文件,我们不知道有哪些库存在。因此,“对这些库运行nm”听起来是自我打击的。 - goldenmean

14

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


1
有没有办法区分原始汇编代码,或者编译器优化和标志也会影响它? - MrMesees

10
如果您有源代码,又不想查看所有代码,则可以在编译时生成映射文件以了解链接的静态库。例如 g++ -Xlinker -Map=a.map main.c,检查映射文件以获取链接的静态库信息。请注意保留HTML标记。

10

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

对于链接器而言,静态库只是一组“惰性”的成员。因此生成的 ELF 可执行文件将仅包含用于链接它的成员。因此,类似libfoo.afoo2.o成员会被链接,就好像对象文件foo2.o被链接到可执行文件中一样(如果需要在某处引用foo2中定义的符号,则提供该符号)。

当然,在一些 ELF 文件上使用命令nmobjdumpreadelfstrings可能会提供一些关于其中包含哪些对象文件(包括来自静态库的对象文件)的提示,因为您会看到那些静态库(或其中使用的文本字符串)中定义的符号。


1
你所说的提示是什么类型的?你能给出一些例子吗?你能指引我到哪里找到更多这样的提示吗? - langlauf.io
1
使用 readelf 可以显示二进制文件中使用的函数、对象和符号。这些可以作为查找所使用的库的提示。例如,您可能会在其中看到 Curl_http 函数,并知道二进制文件很可能使用了 libcurl,如果它没有动态链接,就必须进行静态链接。 - Marcell

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接