2012-10-27 23 views
3

我正在加載和運行Linux平臺上的自定義二進制格式可執行文件(PE,在我的情況下)。到目前爲止,我已經成功完成了這個工作,首先加載可執行文件,然後加載一個小的ELF共享庫,它調用可執行文件的起始地址,然後安全地退出。將ELF共享庫和自定義binfmt可執行文件加載到相同的Linux地址空間中

雖然,我真的很喜歡不做ELF加載自己的原因。首先,我使用的共享庫是用匯編語言編寫的(我不能使用任何其他的東西,因爲我沒有鏈接到libc等),這將是非常特定平臺的,我想遠離並使用C,所以我可以編譯任何平臺。而且,使用Linux的本地ELF加載器而不是我自己的簡化版本會更容易和更安全。

我不知道是否還有用我的binfmt處理程序,已安裝的內核模塊,加載我的可執行文件,然後 Linux的到我的共享庫(及其附屬)加載到相同的地址空間,如果沒有了覆蓋我的可執行代碼。我首先想到的是,uselib系統調用可能是有用的,但該名男子頁面上的描述是不清楚這是否將成爲我的目的:僅在庫「/ lib中/ LD

從libc的4.4.4 .so「加載,這樣 這個動態庫可以加載剩餘的庫(使用此調用再次調用 )。這也是libc5中的事態。

glibc2不使用此調用。

我從來沒有見過它的使用的例子,我總是警惕使用我不明白的系統調用。

有沒有一種很好的方法來實現我所描述的?我可以使用Linux的現有功能將共享庫(用C編寫)加載到已包含可執行代碼的地址空間中,如果可以,我怎樣才能使用該庫而不知道它已加載的位置?

+1

那麼,你可以完全翻轉問題。而不是向內核添加PE支持,而是提供在用戶空間中運行的PE加載器(即ELF可執行文件)。您可能會遇到頁面保護錯誤(嘗試寫入可執行頁面)的一些問題,但在這種情況下,您可以創建一個內核模塊,以便您的應用程序在您的應用程序中創建一個新的可執行頁面。基本上,創建一個內核模塊,可以像PE共享庫一樣加載PE可執行文件。 – Linuxios

+0

@Linuxios我起初嘗試過,但我遇到了固定地址的PE代碼的問題,該地址恰好是默認的Linux加載地址;如果我強制使用'mmap',那麼整個事情就會崩潰,因爲我正在覆蓋內存中正在執行的代碼。我切換到使用內核模塊進行加載時,用戶空間似乎不再是一個選項;它基本上是ELF加載器的模擬器,我想要運行的ELF代碼(來自共享庫)是ELF解釋器的模擬器。 – nosuchthingasstars

+1

我明白了。現在,這裏有一個想法:仍然加載一個elf二進制文件,但告訴GCC創建與位置無關的代碼。然後,必須有某種標題告訴Linux在什麼地址加載你的elf代碼,使PE地址空閒。 – Linuxios

回答

8
+0

我想繼續並接受你的答案(這是非常徹底的),但我還有幾個問題。我已經在這個項目上工作了大約一年,並且徹底堅持下去。加載PE不是問題;我可以將它存入內存並執行它,只要它不引用任何外部庫。你打算如何處理你的實施? – nosuchthingasstars

相關問題