SUSE glibc升級爲2.18過程記錄

先驗知識:
一、運行時,動態庫的裝載依賴於ld-linux.so.6的實現,它查找共享庫的順序以下:
(1)ld-linux.so.6在可執行的目標文件中被指定,可用readelf命令查看
(2)ld-linux.so.6缺省在/usr/lib和lib中搜索;當glibc安裝到/usr/local下時,它查找/usr/local/lib
(3)LD_LIBRARY_PATH環境變量中所設定的路徑
(4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路徑,由ldconfig生成二進制的ld.so.cache中
二、編譯時,搜索庫的路徑順序以下:
(1)ld-linux.so.6由gcc的spec文件中所設定
(2)gcc --print-search-dirs所打印出的路徑,主要是libgcc_s.so等庫。能夠經過GCC_EXEC_PREFIX來設定
(3)LIBRARY_PATH環境變量中所設定的路徑,或編譯的命令行中指定的-L/usr/local/lib 
(2)binutils中的ld所設定的缺省搜索路徑順序,編譯binutils時指定。(能夠經過「ld --verbose | grep SEARCH」來查看)
三、二進制程序的搜索路徑順序爲PATH環境變量中所設定。通常/usr/local/bin高於/usr/bin
四、編譯時的頭文件的搜索路徑順序,與library的查找順序相似。通常/usr/local/include高於/usr/includehtml

 

先升級了gcc爲4.8.2,而後下載2.18的源碼安裝,源碼解壓後:
cd glibc-2.18
mkdir build
cd build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin  
make && make install
須要等大概10分鐘。
java

若是configure時候本身指定安裝目錄會比較麻煩,見後面參考文章,本身就把庫搞錯了致使linux下全部命令都提示段錯誤。最後仍是從新設置LD LIB變量解決的段錯誤恢復過來的。(Probably your LD_LIBRARY_PATH includes a dot / . and that Lib directory contains standard libraries like libc, so what ever command you issue, system picks a library from that path and something goes wrong.)linux

 

成功後:
[root @HY build]#  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_2. 15
GLIBC_2. 16
...
GLIBC_2. 18
GLIBC_PRIVATE
 

 

 

安裝過程遇到的錯誤解決,由於gcc 4.8.2依賴庫的緣由須要設置正確的LD LIB變量:api

configure: error: cannot compute suffix of object files: cannot compileruby

解決辦法:
個人gmp, mpfr, mpc都是使用默認參數安裝的,沒指定任何參數服務器

./configure
make make install

因此直接使用下面的命令設置環境變量就能夠了:測試

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

若是安裝時指定了安裝目錄,使用相似下面的命令:ui

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gcc-4.6.3/mpc-0.9/mpc_install/lib:/opt/gcc-4.6.3/gmp-5.0.4/gmp_install/lib

參考:http://www.jiagoumi.com/work/811.htmlspa

【工做】Centos6.5 升級glibc解決「libc.so.6: version GLIBC_2.14 not found」報錯問題

寫在前面:

研發發來郵件說線上有臺服務器跑程序報錯,信息以下:
./agent: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by./agent)
 

從上面報錯能夠看出,程序運行時候,沒有找到「GLIBC_2.14」這個版本庫,而默認的Centos6.5 glibc版本最高爲2.12, 因此須要更新系統glibc庫。操作系統

 
glibc是gnu發佈的libc庫,即c運行庫,glibc是linux系統中最底層的api,幾乎其它任何運行庫都會依賴於glibc。glibc除了封裝linux操做系統所提供的系統服務外,它自己也提供了許多其它一些必要功能服務的實現。
 
不少linux的基本命令,好比cp, rm, ll,ln等,都得依賴於它,若是操做錯誤或者升級失敗會致使系統命令不能使用,嚴重的形成系統退出後沒法從新進入,因此操做時候須要慎重。

解決辦法:

1.查看系統版本和glibc庫版本

# cat /etc/redhat-release 
CentOS release 6.5 (Final)
 
# 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
 
由上面的信息能夠看出系統是CentOS 6.5,最高支持glibc的版本爲2.12,而研發程序要2.14版本,因此須要升級。
 

2.下載軟件並升級:

# wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz 
# wget http://ftp.gnu.org/gnu/glibc/glibc-ports-2.14.tar.gz 
# tar -xvf  glibc-2.14.tar.gz 
# tar -xvf  glibc-ports-2.14.tar.gz
# mv glibc-ports-2.14 glibc-2.14/ports
# mkdir glibc-build-2.14
# cd glibc-build-2.14/ 
# ../glibc-2.14/configure  --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
# make
 
注意:當make成功後,會在當前glibc-build-2.14目錄下生成一個新的libc.so.6的軟鏈接,指向的是本目錄下的libc.so文件,以下所示:
 
# ll glibc-build-2.14/libc.so.6
glibc-build-2.14/libc.so.6 -> libc.so
 
能夠將上面的libc.so文件直接拷貝到/lib64下面更名爲libc-2.14.so,刪除原來的libc.so.6軟鏈接,創建新的鏈接便可使用,可是此處有一個大坑,後面會介紹,此處仍是按照正常流程安裝。
 

繼續完成後續的安裝: 

# make install 
 
以上完成不報錯的話,查看庫文件,發現/lib64/libc.so.6軟連接指向了2.14版本
 
# ll /lib64/libc.so.6 
/lib64/libc.so.6 -> /lib64/libc-2.14.so
 

3.再次查看glibc支持的版本:

# 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,再次執行程序就不會報錯了。

其餘知識點:

有些安裝方法是編譯時候指定的目錄不是/usr,而是經過創建軟鏈指向新的libc-2.14.so版本,在此過程當中須要刪除原來鏈接,創建新的軟鏈接,可是此處有一個大坑,就是當你刪除libc.so.6以後會致使系統命令不可用,以下在測試機中演示的錯誤過程:
 
# rm -rf /lib64/libc.so.6
 

接下來當你創建新的軟連接時候,會發現ln命令不能用了。

# ln -s /lib64/libc-2.14.so /lib64/libc.so.6
ln: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
 
當出現上面的情況時候,可使用如下方法解決(假設libc-2.14.so已經拷貝到/lib64/目錄下):
# LD_PRELOAD=/lib64/libc-2.14.so ln -s /lib64/libc-2.14.so /lib64/libc.so.6
 
固然若是升級失敗,還可使用下面命令還原至系統升級前的版本libc-2.12.so: 
# LD_PRELOAD=/lib64/libc-2.12.so ln -s /lib64/libc-2.12.so /lib64/libc.so.6
 
「LD_PRELOAD」是一個環境變量,定義在程序運行前優先加載的動態連接庫,本處 做用就是在執行後面的ln命令時,指定使用的glibc庫,這樣命令就能夠正常使用了。
相關文章
相關標籤/搜索