問題來源:
記得之前在Ubuntu上更新了gcc后不翩,運行軟件時出現(xiàn)了如下報錯:
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found
這是因為升級gcc時,生成的動態(tài)庫沒有替換老版本gcc的動態(tài)庫導(dǎo)致的褥琐,將gcc最新版本的動態(tài)庫替換系統(tǒng)中老版本的動態(tài)庫即可解決:
strings /usr/lib64/libstdc++.so.6|grep GLIBC #用string打印舊版本的gcc的動態(tài)庫
發(fā)現(xiàn) GLIBCXX最高只到3.4.13 !
mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak # 先備份舊的
ln -s /usr/local/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6 # 建立軟連接
OK??!成功了辞色!但是前提是你得有sudo權(quán)限垄琐。
這次,我在服務(wù)器上非root條件下進行Pacbio基因組組裝時遇到了同樣的問題:
/lib64/libc.so.6: version `GLIBC_2.14' not found
我用的軟件時Canu1.7僚碎,我心想非root我就下載個GLIBC_2.14的庫,然后解壓縮阴幌,編譯勺阐,再設(shè)置動態(tài)鏈接庫的環(huán)境變量不就ok了么,于是我進行了如下操作
wget -c http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.xz
mkdir glibc_2.14
./configure —-prefix=/home/path/to/glibc_2.14 # 絕對路徑
make -j 8
make install
# 設(shè)置環(huán)境變量
vim ~/.bashrc
# 將下面加入~/.bashrc的最后
export LD_LIBRARY_PATH=/path/to/glibc-2.14/lib:$LD_LIBRARY_PATH
檢查一下:
echo $LD_LIBRARY_PATH
這時候看到動態(tài)鏈接庫的環(huán)境中已經(jīng)有了新版的glibc-2.14的lib路徑矛双,再次運行軟件可以看到之前的報錯沒有了渊抽,但是出現(xiàn)了另外一個問題:軟件卡到一半不動了,也沒有錯誤信息议忽。命令行輸入java/java -version沒有反應(yīng)懒闷。
后來在網(wǎng)上看到別人的文檔中寫到這種情況與此前更新的GLIBC-2.14有關(guān),于是我重裝java栈幸,重裝glibc-2.14愤估,重新設(shè)置環(huán)境變量,這樣折騰了幾十遍(2天)后我看到了這位大神的博客
http://zhuhaidong.win/TP/index.php/Home/Index/article/id/62.html
這種問題稱為:
低版本內(nèi)核下更新GLIBC2.14(libc.so.6)之后速址,java無法正常運行
其原因歸納為灵疮,動態(tài)鏈接庫的管理程序ld.so位于/lib/ld-linux-x86-64.so.2路徑下,更新GLIBC-2.14后與ld.so版本不兼容壳繁,解決方案為:
使用軟件PatchELF(https://nixos.org/patchelf.html)改變編譯好的二進制文件中對于動態(tài)鏈接庫的引用:
./configure --prefix=/home/path/to/software/
make -j 8
make install
patchelf --set-interpreter /home/to/path/software/glibc-2.14/lib/ld-linux-x86-64.so.2 ~/software/jdk1.8.0_191/bin/java
java -version # 發(fā)現(xiàn)成功了
原理是改變ld.so的路徑,使版本匹配荔棉。
解決后就可以開心地再服務(wù)器上運行基因組組裝軟件了闹炉。