【发布时间】:2010-11-10 14:35:20
【问题描述】:
由于ldd 仅列出动态库,有没有办法提取有关用于创建可执行文件的静态库的信息?
【问题讨论】:
由于ldd 仅列出动态库,有没有办法提取有关用于创建可执行文件的静态库的信息?
【问题讨论】:
ldd <exe filename> 显示动态链接库
nm <exe filename> 显示文件中的符号。
要查看哪些符号来自静态库,需要针对这些库运行 nm 以获取其中的符号(函数等)列表,然后将它们与来自 nm <exe filename> 的符号列表进行比较。
您可以使用comm 命令比较列表。详情请见man comm。
本文摘自此论坛here。
【讨论】:
不,库的名称在链接过程中被丢弃。但是,如果您的可执行文件包含调试信息(即,它是使用 -g 标志编译的),您可能能够从中获取信息。
【讨论】:
如果您有源代码并且不想为此浏览所有代码,您可以在编译时生成映射文件以了解链接了哪些静态库。
例如g++ -Xlinker -Map=a.map main.c,查看映射文件中链接的静态库信息。
【讨论】:
除非给定的编译器在二进制文件中存储某种元数据,否则不会。静态库是直接编译成二进制的代码。
【讨论】:
无法获取某些ELF 可执行文件中的静态库列表。
因为对于链接器,静态库只是用作“惰性”成员集。因此,生成的 ELF 可执行文件将仅包含链接它所需的成员。因此,libfoo.a 的 foo2.o 之类的成员被链接起来,就好像目标文件 foo2.o 已链接到可执行文件中一样(前提是需要在 foo2 中定义的某些符号,即在某处引用)。
当然,在某些 ELF 可执行文件上使用 nm、objdump、readelf 或 strings 可能会提示哪些目标文件(包括来自 static 的目标文件库)在其中,因为您会看到在这些静态库(或其中使用的文字字符串)中定义的符号(成员)。
【讨论】: