歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

絕命中的一助linux程序加載器ld

偶然錯誤的將linux系統中的libc.so.6鏈接刪除,導致busybox所有cmd命令失效,報load library error.最終的解決方法是采用預加載庫的方式來解決這個問題:

LD_PRELOAD=/lib/libc-2.6.1.so ln -s /lib/libc-2.6.1.so libc.so.6

根據shell/exec加載elf程序的原理,是先解析ELF,定位並加載ld-linux.so這個程序加載器(該so路徑需要通過ELF直接確定,且不依賴其他庫),然後再解析elf中需要load的共享庫,但這之前可以通過LD_PRELOAD來提前預先加載共享庫,如果程序允許需要的未初始化symbol在預加載庫中的話,就不會再load needed的共享庫(如果預先加載的庫也不滿足運行需要,則繼續根據編譯時symbol所needed關系來load對應的so庫,如果庫查找後不存在就報load error。

預先加載so庫的好處:避免了程序運行時所謂的庫缺失,可以理解為是一種半自動的so加載過程,需要LD_PRELOAD變量來指定真實的庫路徑。當前,所有一切的功勞都是ld-linux的魅力所在。

Copyright © Linux教程網 All Rights Reserved