symbol lookup error:undefined symbol
通過一個實例,引入這個問題。特在此說明一下,搞清楚原因。
問題:
向設備移植openvas時遇到一個問題。
運行openvassd,報錯,在此之前我已經將libgio-2.0.so.0庫移植到設備上,
libgio-2.0.so.0是安裝glib-2.0 (版本號2.42.1)時一塊安裝的庫。
初看錯誤,以為是libgio-2.0.so.0庫有問題,沒有定義g_signal_accumulator_first_wins.
分析:
nm libgio-2.0.so.0庫,發現有符號g_signal_accumulator_first_wins.
openvassd怎么會找不到這個符號的定義呢?
剛開始以為是庫的路徑有問題,
執行ldconfig -v|grep gio
發現鏈接的庫就是新的庫(版本2.42.1安裝的庫),
這時候查看了一下,安裝glib-2.0時,make install的日志文件,發現glib-2.0安裝時,一共安裝了
libglib-2.0.so.0.4200.1
libgmodule-2.0.so.0.4200.1
libgthread-2.0.so.0.4200.1
libgobject-2.0.so.0.4200.1
libgio-2.0.so.0.4200.1
五個庫,
查看了gobject的符號,
發現了問題,兩個庫都有符號g_signal_accumulator_first_wins,
一個是U類型,一個是T類型。
有什么不同,是不是這個不同導致的問題?
關於U類型和T類型的說明如下:
T類型:該符號放在代碼段中,通常是那些全局非靜態函數;
U類型:該符號未定義過,需要自其它對象文件中鏈接進來。
此時,就很清楚了,沒有鏈接上signal_accumulator_first_wins定義符號的庫。也就是gobject庫。
將gobject移植到設備上,發現問題解決了。
參考:man nm
https://www.cnblogs.com/itech/archive/2012/09/16/2687423.html