/lib/libncurses.so: undefined reference to `__fdelt_chk@GLIBC_2.15' collect2: ld

在自己的主機上開發的程序移植到其他機器上是一件很煩人的事情,會出現各種不曾在自己機器上出現的問題,昨天移植了一個程序,make的時候報錯了:

/lib/libncurses.so: undefined reference to `__fdelt_chk@GLIBC_2.15' collect2: ld

一開始沒有理解給出錯誤的信息,搜索了後才知道是符號表中__fdelt_chk編譯的時候使用的是GLIBC_2.15,即2.15版本的GLIBC,爲了驗證一下,執行

objdump -T lib/libncurses.so.5 |grep '__fdelt_chk'

輸出:00000000      DF *UND*    00000000  GLIBC_2.15  __fdelt_chk

__fdelt_chk在libncurses.so.5的符號表裏,看一下本機支持的GLIBC版本,執行

strings /lib/libc.so.6 |grep GLIBC_ 

輸出:

......
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_PRIVATE
再到移植的機器上看一下執行結果:

......
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_PRIVATE
最高只支持到2.12,所以此問題的原因是當前運行系統Glibc版本低於編譯環境Glibc版本造成Glibc版造成的。

方法一,

通過在調用fdelt_chk的源代碼中加入__asm__(".symver fdelt_chk,fdelt_chk@GLIBC_2.2.5");

此處2.2.5是系統支持fdelt_chk的最低版本,通過執行nm /usr/lib/libc.so.6 |grep "__fdelt_chk"得到,不過我的系統中沒有顯示出其他低版本。由於需要在源代碼中加,而ncurses動態庫不是自己編譯生成的,沒有源文件改,所以此方法不適用。

方法二,

用靜態庫的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章