我有一个调用库中定义的函数foo
的程序。我如何知道库在文件系统中的位置? (就像是静态库还是动态链接的lib?)
更新:使用ldd
,程序有很多依赖库。如何判断哪个lib包含函数foo
?
答案 0 :(得分: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
这告诉您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
如果foo
来自共享库,gdb
会告诉您哪一个。如果它来自静态库(在这种情况下gdb
会说in section .text of a.out
),请使用上面的-Wl,-y,foo
解决方案。你也可以这样做一个“蛮力”的解决方案:
find / -name '*.a' -print0 | xargs -0 nm -A | grep ' foo$'
答案 1 :(得分:5)
对于共享库,请尝试使用ldd
命令行工具。
对于静态库,库在程序本身 - 没有外部依赖,这是使用静态库的全部要点。
答案 2 :(得分:5)
您无法在最终二进制文件中列出静态库。要列出链接的动态库,请使用以下命令:在Linux上,使用ldd [file]
。在Mac OS X上,使用otool -L [file]
。在Windows上,我不知道;-)