由于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可执行文件中使用nm
, objdump
或readelf
或strings
可能会提供一些有关哪些对象文件(包括来自静态库的对象文件)的提示,因为您会看到在(成员)那些静态库(或其中使用的文字字符串)。