天天看點

ld-linux.so 解釋器,如何建構elf解釋器(ld-linux.so.2 / ld-2.17.so)作為靜态庫?

I would like to be able to set the path to the interpreter with environment variable similar to LD_LIBRARY_PATH,maybe LD_INTERPRETER_PATH.

這根本不可能.仔細閱讀(和幾次)execve(2),elf(5)& ld.so(8)手冊頁和Linux ABI& ELF規格.還有核心代碼做execve.

ELF解釋器負責動态連結.它必須是檔案層次結構中某個固定位置的檔案(技術上是靜态連結的ELF共享庫)(通常是/lib/ld.so.2或/lib/ld-linux.so.2或/ lib64 / ld- Linux的x86-64.so.2)

20世紀90年代的舊a.out格式有一個内置的動态連結器,部分在舊的Linux 1.x核心中實作.它的靈活性要低得多,而且不那麼強大.

通過這種(原則上)任意動态連結器路徑,核心能夠具有各種動态連結器.但大多數系統隻有一個.這是參數化動态連結器的好方法.如果您想嘗試另一個,請将其安裝在檔案系統中并生成提及該路徑的ELF可執行檔案.

非常痛苦和努力,您可以建立自己的類似ld.so的動态連結器來實作您的LD_INTERPRETER_PATH願望,但該連結器仍然必須是位于檔案樹中某個固定位置的ELF共享庫.

如果你想要一個不需要任何檔案的系統(在某些預定義和有線位置,比如/lib/ld.so,/ dev / null,/ sbin / init …),你需要建構它所有的可執行二進制檔案靜态.您可能希望(但目前的Linux發行版通常不這樣做)有一些靜态連結的可執行檔案(如/ sbin / init,/ bin / sash …),這将使您能夠修複破壞到的點的系統沒有任何動态連結器.

順便說一句,/ sbin / init -or / bin / sh – 路徑連接配接在核心本身内部.您可以在啟動加載時将一些參數傳遞給核心 – 例如.使用GRUB-覆寫預設值.是以即使核心想要一些檔案在這裡!

正如我評論的那樣,您可以檢視MUSL-Libc中的替代Libc實作(提供自己的動态連結器).另請閱讀VDSO和ASLR和initrd.

在實踐中,接受現代Linux和Unix期望一些非空檔案系統的事實……請注意,動态連結和共享庫是一個巨大的進步(在20世紀90年代的Linux核心和發行版中更加痛苦).

或者,定義您自己的二進制格式,然後建立核心子產品或binfmt_misc條目來處理它.

順便說一句,大多數(或全部)Linux都是free software,是以你可以改進它(但這需要幾個月或多年的工作時間).請通過釋出來分享您的改進.