我有一個在庫中定義的程序調用功能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