這幾天升級線上版本,遇到一個glibc版本不一致的問題,導致服務無法升級,坑了我好快兩天。把這個記錄下來方便其他遇到問題的小夥伴可以參考下:
1) 問題現象 :啓動的時候
“/lib64/libc.so.6: version `GLIBC_2.14' not found (required by“
2)查看本地和線上的glibc的版本是否一致:
ldd --version 可以查看下本地的glibc和線上的glibc版本
由於線上機器系統版本不一樣,glibc的版本也不完全一致,一般2.12、2.14、2.17的版本比較多,高版本會兼容低版本
4)查看哪些函數使用了高版本的glibc
strings debug-edge | grep "GLIBC_2.14"
在這裏可以看到是memcpy這個使用了glibc版本
或者使用readelf命令查看
5)常見解決辦法:
一般情況出問題的是編譯的時候用了高版本,但是線上用的是低版本的glibc。例如編譯的時候用了glibc 2.17, 線上用的版本是
glibc 2.12。
第一種:高版本函數替換
查看程序中有哪些函數使用了高版本的glibc庫,如果僅僅只是那一兩個可以考慮其他函數替換
可以參考這篇文章:https://www.jianshu.com/p/308a4e803c81
第二種:升級glibc版本庫
1 安裝 wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz tar zxvf glibc-2.14.tar.gz cd glibc-2.14 mkdir build cd build/ ../configure --prefix=/opt/glibc-2.14 make -j4 make install export LD_LIBRARY_PATH="/opt/glibc-2.14/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
2 建立軟連接 rm -rf /lib64/libc.so.6 ln -s /opt/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6
|
如果能一下升級成功那麼恭喜你,如果升級過程中遇到各種編譯問題,解決這些編譯問題說不定能折騰一整天。
建議別再升級了。我這邊解決方法是自己本地裝個低版本的centos虛擬機可能還更快點,6.9或者6.10的centos系統版本對應默認是glibc 2.12