1. 程式人生 > >用ldd -r, c++filt, nm搞定一個so庫缺符號的問題

用ldd -r, c++filt, nm搞定一個so庫缺符號的問題

       最近, 編譯了一個detailpage.so庫, 直接放到測試環境, 準備驗證業務功能, 結果, 服務重啟的時候顯示: failed to open ....

       1. 這個問題一看就知道原因了, 不是缺靜態庫, 而是缺符號了(符號未定義), 用ldd -r detailpage.so看了一下, 果然如下, 缺符號xxx

       2.  於是用c++file xxx查了一下, 查到了函式。

       3.  於是查詢函式在那麼目錄, 可以用之前說過的findcpp命令, 查到了對應的靜態庫libyyy.a.  到了這不有點納悶了, 一切都有啊, 怎麼異常呢? 準備去請教, 但還是想獨立解決這個問題。 再細想了一下, 繼續搞起。

       4.  看看libyyy.a中缺符號xxx,  用nm命令看了一下, 發現xxx符號前面是U, 果然是未定義啊

       5.  於是更新這個目錄的程式碼, 重編, 就OK了, 一切搞定。

       最後附上nm命令的操作結果:

nm輸出字元 含義
R Read only symbol. 比如在程式碼中有一個const MAXDATA = 3095; 則MAXDATA就是一個Read only symbol
N 這是一個除錯符號
D 這是一個已經初始化的變數的符號。比如程式碼中int i = 1和char *str = "Hello"則i和str都是這種型別的符號
T Text段的符號。子程式都是這種符號,比如檔案中實現了一個函式function,則function就是這種符號
U 未定義的符號。如果檔案中引用了不存在的函式,則這些未定義的函式符號就是這種型別
S 未初始化的符號,比如全域性變數int s;則s的符號就是此型別