由于ldd
仅列出动态库,有没有办法提取有关用于创建可执行文件的静态库的信息?
答案 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可执行文件上使用nm
或objdump
或readelf
或strings
可能会提供一些关于哪些目标文件(包括来自哪些目标文件)的提示 static 库)在其中,因为您将看到在这些静态库(或其中使用的文字字符串)的(成员)中定义的符号。