2010-02-16 65 views
30

我剛剛在Ubuntu上構建了一個共享庫,當我嘗試使用該函數時,加載該庫的應用程序報告未找到'xxx'符號。如何在Ubuntu上共享庫中列出導出的函數

我想檢查(即列出)由我的庫導出的函數,以便我可以進一步調查此問題。

相關信息:

操作系統:Ubuntu 9.10的 編譯器:GCC 4.4.1 鏈接:GNU LD 2.20

回答

26

嘗試納米工具。

GNU nm列出的符號從對象 文件OBJFILE ....如果沒有對象文件 列出作爲參數,納米假定 文件的a.out。 [reference]

+15

**納米-C --defined只-g libXXX.so **爲C++ – 2010-02-16 17:01:33

+0

感謝您的。看起來我的符號被導出,但未定義(它在函數名稱旁邊有一個'U')。一個函數如何導出,但尚未定義(IIRC,一個鏈接器選項可以防止這種混亂)。更重要的是,我能做些什麼來解決它? – 2010-02-16 17:09:20

+0

通過「修復它」,我的意思是如何確保我的函數在共享庫中導出和定義? – 2010-02-16 17:10:30

2

是您在庫加載路徑或應用程序運行時搜索路徑中的共享庫嗎?這聽起來像動態鏈接器無法找到你的庫。嘗試在應用程序上運行ldd,以查看運行庫中是否可以找到該庫,例如

$ ldd /usr/bin/less 
    linux-gate.so.1 => (0x0072a000) 
    libncurses.so.5 => /lib/libncurses.so.5 (0x00c68000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x007c7000) 
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00286000) 
    /lib/ld-linux.so.2 (0x002a1000) 

對庫搜索路徑的其他詳細信息,請參見ld.so(8)手冊頁。

19
nm -D -C -g <library> 

工作得很好。

+1

對於_exported_功能加上'--defined-only'選項,否則這樣你會得到進口過的功能。而且,爲了僅獲得_functions_而不是例如像'_edata'這樣的東西,你應該在第二列中用'T'或't'來尋找符號。所以,像這樣:'nm -DCg --defined-only $ MY_LIB | grep'^ [0-9a-f] \ + [Tt]'' – Ruslan 2016-08-29 18:25:37