用ldd -r, c++filt, nm搞定一個so庫缺符號的問題
阿新 • • 發佈:2019-02-01
最近, 編譯了一個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的符號就是此型別 |