由于ldd
仅列出动态库,是否有一种方法可以提取有关用于创建可执行文件的静态库的信息?获取可执行文件中使用的静态库的列表
回答
ldd <exe filename>
显示动态链接库
nm <exe filename>
示出了在该文件中的符号。
要查看哪些符号来自静态库,需要针对这些库运行nm
以获取其中的符号列表(函数等),然后将它们与nm <exe filename>
中的符号列表进行比较。
您将列表与comm
命令进行比较。详情请参阅man comm
。
这是来自这个论坛here。
不,在链接过程中会丢弃这些库的名称。但是,如果您的可执行文件包含调试信息(即使用-g标志编译),则可以从中获取信息。
有没有办法辨别RAW ASM,还是编译器优化和标志也会影响? – MrMesees 2017-12-16 16:36:50
除非给定的编译器在二进制内存储某种元数据,否则不会。静态库是直接编译到二进制文件中的代码。
如果您有源代码并且不想通过所有代码,您可以在编译时生成映射文件以了解哪些静态库已链接。
例如g++ -Xlinker -Map=a.map main.c
,请检查映射文件以获取链接的静态库信息。
无法获得某些ELF可执行文件中的静态库列表。
因为对于链接器,静态库仅用作“懒惰”成员集。因此,最终的ELF可执行文件将只包含链接它所需的成员。因此,像,libfoo.a
这样的成员链接好像目标文件foo2.o
已链接到可执行文件中(只要需要在foo2
中定义的某个符号,即在某处引用)。
当然,使用nm
,或objdump
或readelf
,或strings
一些ELF可执行文件可以提供一些提示什么目标文件(包括那些从静态库推出)都在里面,因为你会看到符号在这些静态库(或其内部使用的文字串)的(成员)中定义。
- 1. 从可执行文件中提取静态链接的库
- 2. Linux,静态库引用可执行文件中的其他静态库
- 3. 如何获取android.so文件中可用的静态库
- 4. 如何使用Qt构建静态库和可执行文件?
- 5. qmake:使可执行文件和静态库成为可能
- 6. 如何检查附加到可执行文件的静态库?
- 7. 谷歌测试可执行文件或静态/动态库?
- 8. GDB可以使用静态链接库重新加载可执行文件吗?
- 9. 获取可执行文件
- 10. 如何获取库/可执行文件的可执行代码段的大小?
- 11. 获取的文件列表中的库文件夹与沙箱中的可可
- 12. 加载链,静态库和可执行文件
- 13. Scons,仅从静态库构建C++可执行文件
- 14. 框架(“包装”静态库)有两个可执行文件
- 15. CMake Visual Studio链接可执行文件与静态库
- 16. 获取ResourceManager的静态库
- 17. 不包含在生成的LLVM可执行文件中的静态库
- 18. 使用CMAKE编译静态可执行文件
- 19. 链接可执行文件中缺少静态库中的符号
- 20. 试图在Linux/Ubuntu上使用Oracle库构建静态CGO可执行文件
- 21. 可疑的静态链接可执行文件大小
- 22. 在静态链接的可执行文件中使用GPL许可库的代码?
- 23. 静态链接的可执行文件比动态链接的可执行文件更快吗?
- 24. 如何将外部库静态链接到我的可执行文件中?
- 25. 获取可执行文件的使用目录
- 26. 如何使用Fortran获取可执行文件的位置?
- 27. 在静态库中读取.pch文件
- 28. 引用C静态库中的文件
- 29. 将静态文件编译为可执行文件
- 30. 如何在android中创建可执行的静态库?
正如@Goz和anon所指出的那样,这只有在二进制文件没有被剥离/包含调试信息时才有效。在静态库链接到应用程序后,名称不是必需的(甚至不用) - 这些调用都是通过地址。 – 2014-05-14 23:23:04
这不回答问题。 “如果你不了解这些库,就不可能对这些库运行nm”;并且在链接中隐含地使用了库。 – kavadias 2015-03-02 15:38:46