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

Sau*_*abh 43 c c++ unix linker static

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

DrA*_*rAl 47

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

nm <exe filename> 显示文件中的符号.

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

您将列表与comm命令进行比较.详情man comm请见.

这是从这个论坛采取了这里.

  • 正如@Goz和anon指出的那样,这只有在二进制文件没有被剥离/包含调试信息时才有效.将静态库链接到应用程序后,名称不是必需的(甚至不使用) - 调用都是通过地址进行的. (2认同)
  • 这并没有回答这个问题。如果您不了解这些库,则无法“针对这些库运行 nm”;并且在链接中隐式使用了一些库。 (2认同)
  • 如果它是未知的二进制文件,则我们不知道存在哪些库。因此,“对这些库运行nm”听起来很失败。 (2认同)

小智 11

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


小智 8

如果您有源代码并且不想为此完成所有代码,则可以在编译时生成映射文件以了解链接的静态库.

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


Goz*_*Goz 5

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


Bas*_*tch 5

无法获取某些ELF可执行文件中的静态库列表。

因为对于链接器,静态库仅用作“惰性”成员集。因此,生成的ELF可执行文件仅包含链接它所需的成员。因此,像foo2.oof 一样的成员libfoo.a被链接起来,就好像对象文件foo2.o已链接到可执行文件中一样(前提foo2是需要使用中定义的某些符号,即在某处引用了该符号)。

当然,使用nm,或objdump,或readelf,或strings在某些ELF可执行文件可能给什么对象文件(包括那些来自未来的一些提示静态库)都在里面,因为你会看到(成员)的静态库定义的符号(或其中使用的文字字符串)。