在自己的主機上開發的程序移植到其他機器上是一件很煩人的事情,會出現各種不曾在自己機器上出現的問題,昨天移植了一個程序,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動態庫不是自己編譯生成的,沒有源文件改,所以此方法不適用。
方法二,
用靜態庫的方法。