1. 程式人生 > >centos環境升級glibc到2.17及過程中遇到的問題

centos環境升級glibc到2.17及過程中遇到的問題

動態加載 gcc figure require libc 自己 mkdir 時報 開發

升級glibc到2.17及出現的問題

開發要求libc庫最低是2.17,但是我這個是2.12的,當然不能用了,還好,gcc 4.8.5的,直接用來編譯升級就好了。

開始前

執行程序的時候報了一個錯:

/lib64/libc.so.6 version GLIBC_2.14 not found

很明顯鏈接的庫不是2.14的。根據 tlpi上所說的,動態加載庫有三個名字比較重要。文件名,庫名,鏈接器名,而且用ldconfig 來進行管理與更新。如:

  • realname : libmath.so.1.3 文件名
  • soname : libmath.so.1 庫名
  • linkername : libmath.so 鏈接器編譯的時候鏈接的名稱。

ldconfig命令幹的活,就是在默認目錄和我們制定的庫目錄內尋找所有的庫文件,然後根據文件名來更新最新的連接。比如吧,看一下我們需要的 libc.so.6現在的指向。

ll /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Jul  9 22:30 /lib64/libc.so.6 -> libc-2.12.so

瞧,是個符號鏈接文件吧。我們就是要把後面的變成2.18來。

升級

升級非常的簡單:

wget http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz
tar –zxvf glibc-2.17.tar.gz
cd glibc-2.17
mkdir build
cd build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
make –j4
make install     #這一步切記。就算提示error 先不要慌 接著往下走

安裝後就會發現, 這一步 不一定大家都會順利實現,請看下面遇到的問題:

ll /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Jul  9 22:30 /lib64/libc.so.6 -> libc-2.18.so

遇到的問題

我開始沒有執行 make install,然後想著不安裝,自己編譯了受手動制定鏈接定制就行了。

果斷的一個 rm -f /lib64/libc.so.6,然後,結果就坑了。所有的命令都執行不了,因為沒有了這個共享庫了,很多命令都是基於這個庫的。型號,萬能的谷歌。

讓我先把命令找回來。想到這個動態庫本來就是鏈接到一個真實文件的,那如果我們要指定加載的庫位置,不需要這個鏈不也是可以的,確實是這樣的。我們可以指定運行時加載庫的加載庫

LD_PRELOAD=/lib64/libc-2.12.so ln -s /lib64/libc-2.12.so /lib64/libc.so.6

這樣就恢復原狀,後面執行 make install就OK了

在make install時報錯error

#有些人會在make install後出現error。這兒error我沒去細究,此時可以查看一下系統此時的GLIBC版本,參考一開始的做法。如果版本未升級,我們只能手動安裝一下:
首先make是成功了,那麽我們會發現build目錄下編譯出了一個新的libc.so.6 (/glibc-build-2.17/libc.so.6, 我們會發現這實際上也是一個軟連接,真實的lib文件是libc.so

make: *** [install] Error 2     這就是上面的報錯 
然後:
[root@xsl003 build]# pwd
/lib64/glibc-2.17/build
[root@xsl003 build]# ll /lib64/lobc.so.6
ls: /lib64/libc.so.6: version `GLIBC_2.14‘ not found (required by /lib64/librt.so.1)
ls: /lib64/libc.so.6: version `GLIBC_2.14‘ not found (required by /lib64/libpthread.so.0)
[root@xsl003 build]# ll libc.so
libc.so    libc.so.6  
這裏的libc.so即為真實的lib文件
接著:
[root@xsl003 lib64]# LD_PRELOAD=/lib64/glibc-2.17/build/libc.so  ln -sf /lib64/libc-2.17.so /lib64/libc.so.6
[root@xsl003 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_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_PRIVATE
說明連接安裝成功

centos環境升級glibc到2.17及過程中遇到的問題