簡體   English   中英

有沒有辦法將Linux共享庫加載到特定的內存位置?

[英]Is there a way to load a Linux shared library into a specific memory location?

我有一個Linux應用程序,它在運行時加載非常小的(一些小函數)共享庫。 對於各種重要原因,我需要將共享庫加載到某個虛擬內存范圍。 但是, dlopen()沒有提供任何方法(我可以看到)告訴它,或提示它,在哪里放置它加載的東西。

有沒有辦法告訴dlopen()應該把它加載的庫放在哪里?

是否有一些替代dlopen()可以提供該功能?

您需要指定要嘗試解決的實際問題。

對於各種重要原因™

我只能解釋這句話,因為這是你要求的,你不能做任何事情(即爭議)。
所以關於你的問題:
已指定加載地址,因此您無法通過此庫更改它。 實際上你需要閱讀PIC
我認為做你想做的事的唯一方法是“破解”庫並修改文本段。
請查看指定的首選加載地址

說實話,你應該在這里解釋你試圖解決的問題是什么,這樣你就可以得到答案,以各種方式幫助你。 也就是說,你可以有另一種選擇作為解決方案

我認為如果您願意修改庫,預鏈接程序實際上可能會演示一種方法。 目標是修改庫,使其具有首選地址。 預鏈接的目的是為了提高性能,但我懷疑它可以修改為適合您的用例。 請注意,永遠不會保證在一般情況下會發生這種情況,但在受控制的情況下,您可以保證它會發生。 當然,檢查預鏈接將使您了解所涉及的精靈的部分,並做出更明智的決定是否可能。 http://en.wikipedia.org/wiki/Prelink#或查看http://packages.qa.debian.org/prelink了解Debian中的資源。

您不能這樣做,並且在最近的Linux系統上dlopen (甚至沒有 MAP_FIXED任何mmap )都受ASLR的約束。

因此,即使您成功在某個固定地址執行相當於dlopen ,您的方法也會失敗,除非您在系統范圍內禁用ASLR

特別是執行相同dlopen -s的相同程序的兩個“相同”運行將進入可能不同的地址(即,具有dlopen -ed共享庫)。

此外,在Linux上,你可以dlopen共享對象的大很多(至少幾十萬)。 以我的manydl.c為例

正如我評論的那樣,您的問題看起來像是一個XY問題 你應該解釋你想要的原因。 真正的動機和總體目標是什么?

您可以通過處理ELF共享對象文件來自己重新實現修改后的dlopen ,並自己重新定位。 您還需要專門編譯和鏈接您的共享對象。

如果函數是簡單的小(如果你接受相對表現略有下降,以dlopen -ing編譯小的共享庫gcc -fPIC -O2 -shared -Wall ),你可以考慮使用一些JIT編譯庫,例如libjitGNU lightingasmjitLLVM ,...在某個固定地址生成機器代碼(或者只是生成一個調用或跳轉到真正的共享庫函數)

順便說一下,你可以使用和適應你的怪異需求musl-libc (它包括一個你可以根據你的需要移植的dlopen功能)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM