誤刪除libc.so.6的解決


最近安裝一個軟件需要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 就又存在了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM