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

由于ldd只列出了dynamic库,有没有办法提取有关用于创build可执行文件的静态库的信息?

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

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

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

您将列表与comm命令进行比较。 详细信息请参见man comm

这是从这个论坛在这里 。

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

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

如果你有源代码,不想通过所有的代码,你可以在编译的时候生成地图文件,以知道哪些静态库链接。

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

没有办法获得一些ELF可执行文件中的静态库列表。

因为对于链接器,静态库仅仅被用作“懒惰”的成员集合。 因此,最终的ELF可执行文件将只包含链接它所需的成员。 所以像libfoo.a这样的成员链接就好像目标文件foo2.o被链接到可执行文件(提供了一些在foo2定义的符号是必要的,即被引用的地方)。

当然,在某些ELF可执行文件中使用nmobjdumpreadelfstrings可能会提供一些有关哪些对象文件(包括来自静态库的对象文件)的提示,因为您会看到在(成员)那些静态库(或其中使用的文字字符串)。