1. 程式人生 > >絕命中的一助linux程式載入器ld-linux.so中的LD_PRELOAD預載入庫

絕命中的一助linux程式載入器ld-linux.so中的LD_PRELOAD預載入庫



偶然錯誤的將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的魅力所在。