程序链接到哪个库提供给定的功能?

Ric*_*ard 4 c gdb

我有一个程序调用foo库中定义的函数.我如何知道库在文件系统中的位置?(就像是静态库还是动态链接的lib?)

更新:使用时ldd,程序有很多依赖库.如何判断哪个lib包含函数foo

Emp*_*ian 7

您没有说明您使用的操作系统,答案与系统有关.

在Linux和大多数UNIX系统上,您只需要求链接器告诉您.例如,假设您想知道printf这个程序的来源:

#include <stdio.h>
int main()
{
  return printf("Hello\n");
}

$ gcc -c t.c
$ gcc t.o -Wl,-y,printf
t.o: reference to printf
/lib/libc.so.6: definition of printf
Run Code Online (Sandbox Code Playgroud)

这告诉你在printf中引用t.o和定义libc.so.6.上述解决方案适用于静态库和共享库.

既然你用这个问题标记过gdb,那么你可以在gdb中做些什么:

gdb -q ./a.out
Reading symbols from /tmp/a.out...done.

(gdb) b main
Breakpoint 1 at 0x400528
(gdb) run

Breakpoint 1, 0x0000000000400528 in main ()
(gdb) info symbol &printf
printf in section .text of /lib/libc.so.6
Run Code Online (Sandbox Code Playgroud)

如果foo来自共享库,gdb将告诉您哪一个.如果它来自静态库(在这种情况下gdb会说in section .text of a.out),请使用-Wl,-y,foo上面的解决方案.你也可以这样做一个"强力"解决方案:

find / -name '*.a' -print0 | xargs -0 nm -A | grep ' foo$'
Run Code Online (Sandbox Code Playgroud)


paj*_*ton 5

对于共享库,请尝试使用ldd命令行工具.

对于静态库,库位于程序本身 - 没有外部依赖,这是使用静态库的重点.


Dar*_*ust 5

您不能在最终二进制文件中列出静态库.要列出链接的动态库,请使用以下命令:在Linux上,使用ldd [file].在Mac OS X上,使用otool -L [file].在Windows上,我不知道;-)