2010-06-30 157 views

回答

4

可以使用nm命令行工具來列出導出的符號中的二進制文件:

~/src> cat nm-test.c 

static int plus_four(int x) 
{ 
     return x + 4; 
} 

int sum_plus_four(int a, int b) 
{ 
     return plus_four(a + b); 
} 

int product_plus_four(int a, int b) 
{ 
     return plus_four(a * b); 
} 
~/src> gcc -c nm-test.c 
~/src> nm ./nm-test.o 
00000000 t plus_four 
00000023 T product_plus_four 
0000000b T sum_plus_four 

根據the manual,「T」意味着符號是在代碼(文字)鏈段,和大寫手段它是公開的。

如果你有一個你正在尋找的符號,你可以使用nm來讓一個庫導出的符號可以通過例如grep:

$ find -name lib*.a /example/library/path | xargs nm | grep -E "T $SYMBOL_TO_FIND" 

該命令行是未經測試的草圖,但它應該顯示該概念。

+0

這是否沒有找到給定的函數名稱的函數名稱,而不是給出函數名稱的函數庫? – 2010-06-30 07:54:07

+0

@Pete:是的,但是由於它導出信息,它可以用於grep庫文件。 – unwind 2010-06-30 08:06:44

+0

謝謝..我知道了.. – Dinesh 2010-06-30 08:44:26

1

如果它是C標準API的一部分,那麼只需運行man,它應該清楚地說明函數的定義位置。

+0

如果不是這樣,圖書館的文檔大概說明了如何鏈接到它。 – nos 2010-06-30 08:10:37

1

如果您想以非程序化的方式找出圖書館,您可能會發現LSB Navigator有用。在搜索框中輸入該函數,然後用綠色「狀態」檢查該行中的庫。

http://coldattic.info/pic/165509391387.png

這將是「傳統的」庫包含函數(在上面描述的例子,librtmq_unlink正確的庫,讓你-lrt鏈接)。只需與該庫鏈接,它幾乎可以在所有Linux系統上運行。

注:我是我推薦的工具的開發人員之一。