我有一个在库中定义的程序调用功能foo
。我怎么知道库在文件系统中的位置? (就像它是一个静态库或动态链接的lib?)该程序链接到哪个库提供给定的功能?
更新:使用ldd
,该方案具有很大的依赖性库。如何判断哪个库包含函数foo
?
我有一个在库中定义的程序调用功能foo
。我怎么知道库在文件系统中的位置? (就像它是一个静态库或动态链接的lib?)该程序链接到哪个库提供给定的功能?
更新:使用ldd
,该方案具有很大的依赖性库。如何判断哪个库包含函数foo
?
你没有说哪个操作系统你是,答案是取决于系统。
在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$'
对于共享库尝试使用ldd
命令行工具。
对于静态库,库是的程序本身 - 没有外部依赖关系,这是使用静态库的全部要点。
不能列出最终二进制静态库。要列出链接的动态库,请使用以下命令:在Linux上,使用ldd [file]
。在Mac OS X上,使用otool -L [file]
。在Windows上,我不知道;-)
在Windows上,depend.exe(http://www.dependencywalker.com /)。 – Thanatos 2011-04-02 23:19:57
[HT](http://hte.sf.net/)也可以查看Windows对象。 – user611775 2011-04-03 00:16:49
的可能的复制[?如何知道哪个库中的特定功能所定义](http://stackoverflow.com/questions/5563354/how -to-know-which-library-a-specific-function-is-defined-in)投票以因为upvote count而关闭的方式;-) – 2016-04-18 18:22:05