2009-07-14 126 views

回答

35

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

nm <exe filename>示出了在该文件中的符号。

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

您将列表与comm命令进行比较。详情请参阅man comm

这是来自这个论坛here

+2

正如@Goz和anon所指出的那样,这只有在二进制文件没有被剥离/包含调试信息时才有效。在静态库链接到应用程序后,名称不是必需的(甚至不用) - 这些调用都是通过地址。 – 2014-05-14 23:23:04

+0

这不回答问题。 “如果你不了解这些库,就不可能对这些库运行nm”;并且在链接中隐含地使用了库。 – kavadias 2015-03-02 15:38:46

10

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

+0

有没有办法辨别RAW ASM,还是编译器优化和标志也会影响? – MrMesees 2017-12-16 16:36:50

5

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

6

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

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

2

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

因为对于链接器,静态库仅用作“懒惰”成员集。因此,最终的ELF可执行文件将只包含链接它所需的成员。因此,像,libfoo.a这样的成员链接好像目标文件foo2.o已链接到可执行文件中(只要需要在foo2中定义的某个符号,即在某处引用)。

当然,使用nm,或objdumpreadelf,或strings一些ELF可执行文件可以提供一些提示什么目标文件(包括那些从静态库推出)都在里面,因为你会看到符号在这些静态库(或其内部使用的文字串)的(成员)中定义。

相关问题