最近安裝一個軟件需要glibc-2.17。
使用ldd --version 發現系統的glibc版本為 glibc-2.12,當時沒有想到更好的方法,就嘗試將系統的glibc版本修改為glibc-2.17
進行編譯安裝 glibc-2.17
http://ftp.gnu.org/gnu/glibc 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/local/glibc-2.17 make -j4 sudo make install export LD_LIBRARY_PATH=/usr/local/glibc-2.17/lib
錯誤源頭:
當make install 完成之后,需要將 /lib64/libc.so.6 軟鏈接更新為 /usr/local/glibc-2.17/lib/libc-2.17.so,
於是我准備刪除 /lib64/libc.so.6,然后新建一個指向/usr/local/glibc-2.17/lib/libc-2.17.so.然后我就刪除了 /lib64/libc.so.6,然后,就沒有然后了。。。
glibc:
libc.so.6 是c運行時庫 glibc的軟鏈接,而系統幾乎所有程序都依賴c運行時庫。程序啟動和運行時,是根據libc.so.6 軟鏈接找到glibc庫。刪除libc.so.6將導致系統的幾乎所有程序不能工作。
每個glibc.so文件有它支持的libc版本,可以通過:
strings /lib64/libc.so.6 |grep GLIBC_
查看。如果程序編譯的時候鏈接的libc庫版本不在程序運行環境下的glibc庫支持的libc版本之內,也會報錯.
於是,系統的所有命令 ls,cp,cd 等等都無法使用了。
解決方法,根據自己安裝的情況(可能安裝路徑不同):
LD_PRELOAD=/usr/local/glibc-2.17/libc-2.17.so ln -s /usr/local/glibc-2.17/libc-2.17.so /lib64/libc.so.6
LD_PRELOAD的解決原理是,linux調用so庫文件時,先搜索當前路徑,然后是系統庫目錄,提供LD_PRELOAD系統變量可以改變這個順序,改變后的搜索順序為 LD_PRELOAD, 當前路徑, 系統庫目錄。 於是,使用LD_PRELOAD指向正常的glibc庫文件,然后執行ln等命令,就可以正常執行,執行成功之后, libc.so.6 就又存在了。