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

时间:2009-07-14 10:29:18

标签: c++ c unix static linker

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

5 个答案:

答案 0 :(得分:42)

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

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

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

您将列表与nm <exe filename>命令进行比较。有关详细信息,请参阅comm

这是从这个论坛here获取的。

答案 1 :(得分:11)

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

答案 2 :(得分:8)

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

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

答案 3 :(得分:5)

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

答案 4 :(得分:4)

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

因为对于链接器,静态库仅用作“惰性”成员集。因此,生成的ELF可执行文件仅包含链接它所需的成员。因此,像foo2.o libfoo.a这样的成员被链接,好像对象文件foo2.o被链接到可执行文件中(假设需要在foo2中定义一些符号,即在某处引用)。

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