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

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

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

您没有说明您使用的操作系统,答案取决于系统。

在Linux和大多数UNIX系统上,您只需要求链接器告诉您。 例如,假设您想知道printf来自此程序的位置:

 #include  int main() { return printf("Hello\n"); } $ gcc -c tc $ gcc to -Wl,-y,printf to: reference to printf /lib/libc.so.6: definition of printf 

这告诉您printflibc.so.6被引用并在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 

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

 find / -name '*.a' -print0 | xargs -0 nm -A | grep ' foo$' 

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

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

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