libc.so.6: version 'GLIBC_2.14' not found報錯提示的解決方案

散盡浮華發表於2018-04-08

 

線上一臺伺服器在執行leveldb程式的時候,報錯:"libc.so.6: version `GLIBC_2.14' not found"。 排查原因及解決方法如下:

1)產生原因
是由於Linux系統的glibc版本太低,而軟體編譯時使用了較高版本的glibc引起的!

檢視系統glibc支援的版本
[root@localhost ~]# strings /lib64/libc.so.6 |grep GLIBC_  
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_PRIVATE

[root@localhost ~]# rpm -qa |grep glibc
glibc-common-2.12-1.209.el6_9.2.x86_64
glibc-2.12-1.209.el6_9.2.x86_64
glibc-headers-2.12-1.209.el6_9.2.x86_64
glibc-devel-2.12-1.209.el6_9.2.x86_64

可以看到最高只支援2.12版本。現在需要將glibc支援的版本升級到GLIBC_2.14

2)升級glibc支援的版本到GLIBC_2.14

到http://www.gnu.org/software/libc/下載最新版本,這裡下載了glibc-2.14.tar.xz 這個版本,解壓到/usr/local/src目錄下
百度雲盤下載地址:https://pan.baidu.com/s/1YGia4YD45s42xMq9VapJow
提取密碼:nejp
   
[root@uatblockchain01 ~]# cd /usr/local/src/
[root@uatblockchain01 src]# ll
total 9888
-rw-r--r-- 1 root root 10122492 Apr  8 03:21 glibc-2.14.tar.xz
[root@uatblockchain01 src]# tar -vxf glibc-2.14.tar.xz
   
建立/var/VMdisks,將解壓後的glibc-2.14移到/var/VMdisks目錄下
[root@uatblockchain01 src]# mkdir -p /var/VMdisks
[root@uatblockchain01 src]# mv glibc-2.14 /var/VMdisks/
   
在glibc原始碼目錄建立構建目錄,並cd進入構建目錄
[root@uatblockchain01 src]# cd /var/VMdisks/glibc-2.14/
[root@uatblockchain01 glibc-2.14]# mkdir build && cd build/
[root@uatblockchain01 build]# ../configure --prefix=/usr/local/glibc-2.14
[root@uatblockchain01 build]# make -j4
[root@uatblockchain01 build]# make install
   
臨時修改環境變數
[root@uatblockchain01 build]# export LD_LIBRARY_PATH=/usr/local/glibc-2.14/lib:$LD_LIBRARY_PATH
[root@uatblockchain01 build]# echo $LD_LIBRARY_PATH
/opt/glibc-2.14/lib:
================================================================================================
注意:
這裡環境變數要如上一樣臨時修改,決不能寫在/etc/profile檔案裡,並source使之生效!否則會導致某些shell命令執行不了。
比如:
[root@uatblockchain01 build]# vim /etc/profile
.......
export LD_LIBRARY_PATH=/usr/local/glibc-2.14/lib:$LD_LIBRARY_PATH
[root@uatblockchain01 build]# source /etc/profile

這樣,將會出現一些命令卡住的現象。
[root@uatblockchain03 ~]# java -version      //一直卡著不動

[root@uatblockchain03 ~]# su - app           //一直卡著不動

解決辦法:
將上面那條配置從/etc/profile檔案裡刪除,然後source使之生效!
重新登入機器即可解決!
================================================================================================

如果是在普通使用者下,就修改普通使用者下的環境變數。比如這裡我是在app賬號下啟動的leveldb程式,那麼:
[app@uatblockchain01 ~]$ export LD_LIBRARY_PATH=/usr/local/glibc-2.14/lib:$LD_LIBRARY_PATH
[app@uatblockchain01 ~]$ echo $LD_LIBRARY_PATH
/opt/glibc-2.14/lib:
   
修改/lib64/libc.so.6的軟連結來源,由之前的libc-2.12.so修改為libc-2.14.so
[root@uatblockchain01 ~]# cd /lib64
[root@uatblockchain01 ~]# ll libc.so.6
lrwxrwxrwx 1 root root 12 Apr  8 03:50 libc.so.6 -> libc-2.12.so
   
[root@uatblockchain01 ~]# ll /usr/local/glibc-2.14/lib/libc-2.14.so
-rwxr-xr-x 1 root root 9645192 Apr  8 03:28 /usr/local/glibc-2.14/lib/libc-2.14.so
[root@uatblockchain01 ~]# cp /usr/local/glibc-2.14/lib/libc-2.14.so /lib64/
   
刪除libc-2.12.so之前的軟連結
[root@uatblockchain01 ~]# unlink /lib64/libc.so.6
或者直接執行
[root@uatblockchain01 ~]# rm -f /lib64/libc.so.6
==============================================================================================
如果上面刪除命令執行後,導致該機器的很多shell命令無法執行!甚至於機器無法登陸!報錯如下:
error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
   
注意:千萬不要關閉當前的終端視窗,因為此時機器可能無法登陸了。只能在當前終端視窗下進行緊急修復:
[root@uatblockchain01 ~]# ldconfig
 
原因可能是:前面設定"export LD_LIBRARY_PATH= "有誤導致的。
linux呼叫so的庫檔案時,搜素路徑為當前路徑,再是系統lib目錄。
可能是由於前面提供了一個LD_PRELOAD系統變數來改變這個順序。
設定LD_PRELOAD了後,庫載入的順序就改變了。
搜素路徑為:LD_PRELOAD ,當前路徑,再是系統lib目錄。
==============================================================================================
   
然後做/lib64/libc.so.6新的軟連結,軟連結到libc-2.14.so
[root@uatblockchain01 lib64]# ln -s libc-2.14.so /lib64/libc.so.6
[root@uatblockchain01 lib64]# ll libc.so.6
lrwxrwxrwx 1 root root 12 Apr  8 03:50 libc.so.6 -> libc-2.14.so
   
最後再檢視系統glibc支援的版本:
[root@uatblockchain01 lib64]# strings /lib64/libc.so.6 |grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
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_PRIVATE
   
發現glibc最高可以支援到2.14版本了。
   
然後再執行leveldb程式,就會發現不會有那個報錯了!問題得到解決!

相關文章