linux系統更新libc ,libstdc++標準庫
開發環境下正常執行的c++程式放到新的環境重新make後報:
/lib64/libc.so.6: version `GLIBC_2.18' not found (required by /lib64/libstdc++.so.6)
/lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /lib64/libstdc++.so.6)
檢視新環境的GLIBC版本:
srings /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
strings /lib64/libstdc++.so.6 | grep CXXABI
[[email protected] lib64]# strings libstdc++.so.6 | grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
發現確實版本不夠
需要分別升級c和c++庫
檢視本地庫的實際地址:
ll /usr/lib64/libstdc++.so.6
lrwxrwxrwx 1 root root 19 Nov 16 09:27 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.19
ll /usr/lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Nov 16 09:16 /usr/lib64/libc.so.6 -> libc-2.17.so
==========================================================
升級libc
# wget http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
(17版本以後不需要port依賴庫)
下載完成後,解壓,並進入解壓後的目錄
# tar -xvf glibc-2.18.tar.gz
# 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之後 得到新的庫,以後指向新的庫的軟連線libc.so.6
# strings libc.so.6 |grep GLIBC | head -30
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_2.18
GLIBC_PRIVATE
]# ll | grep libc
-rw-r--r-- 1 root root 22246960 Nov 16 09:58 libc.a
-rw-r--r-- 1 root root 192 Nov 16 09:52 libc-abis.h
-rw-r--r-- 1 root root 0 Nov 16 09:52 libc-abis.stamp
-rw-r--r-- 1 root root 93 Nov 16 09:52 libcidn.map
-rw-r--r-- 1 root root 33865 Nov 16 09:52 libc.map
-rw-r--r-- 1 root root 72910 Nov 16 09:58 libc_nonshared.a
-rw-r--r-- 1 root root 25446348 Nov 16 09:58 libc_pic.a
-rw-r--r-- 1 root root 21951016 Nov 16 09:58 libc_pic.os
-rw-r--r-- 1 root root 109 Nov 16 09:52 libcrypt.map
-rwxr-xr-x 1 root root 10230960 Nov 16 09:58 libc.so
lrwxrwxrwx 1 root root 7 Nov 16 09:58 libc.so.6 -> libc.so
此時切記不要直接複製此資料夾內的檔案到系統/usr/lib64去替換原始庫檔案(如果已刪除,刪除系統libc.so.6,會導致系統命令不可用, 請使用LD_PRELOAD相關命令恢復)
繼續make install
正好完成後 ,新編譯的庫會生成到系統目錄下
/usr/lib64/ | grep libc
-rwxr-xr-x. 1 root root 2173512 Apr 10 2018 libc-2.17.so
-rwxr-xr-x 1 root root 10230960 Nov 16 10:08 libc-2.18.so
lrwxrwxrwx 1 root root 12 Nov 16 10:08 libc.so.6 -> libc-2.18.so
再次檢視系統c庫版本
[[email protected] lib64]# strings 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_2.18
GLIBC_PRIVATE
c庫升級完成
====================================================
升級c++庫
檢視本地庫的實際地址:
#ll /usr/lib64/libstdc++.so.6
lrwxrwxrwx 1 root root 19 Nov 16 09:27 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.19
拷貝高版本標準庫libstdc++.so.6.0.21到該目錄(可網上下載)
重新設定軟連線
#ln -snf /usr/lib64/libstdc++.so.6.0.21 /usr/lib64/libstdc++.so.6
檢視新版本情況