[英]GCC - Relocate data section of a shared library to specific memory location
[英]Is there a way to load a Linux shared library into a specific memory location?
我有一個Linux應用程序,它在運行時加載非常小的(一些小函數)共享庫。 對於各種重要原因,我需要將共享庫加載到某個虛擬內存范圍。 但是, dlopen()
沒有提供任何方法(我可以看到)告訴它,或提示它,在哪里放置它加載的東西。
有沒有辦法告訴dlopen()
應該把它加載的庫放在哪里?
是否有一些替代dlopen()
可以提供該功能?
我認為如果您願意修改庫,預鏈接程序實際上可能會演示一種方法。 目標是修改庫,使其具有首選地址。 預鏈接的目的是為了提高性能,但我懷疑它可以修改為適合您的用例。 請注意,永遠不會保證在一般情況下會發生這種情況,但在受控制的情況下,您可以保證它會發生。 當然,檢查預鏈接將使您了解所涉及的精靈的部分,並做出更明智的決定是否可能。 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編譯庫,例如libjit , GNU lighting , asmjit , LLVM ,...在某個固定地址生成機器代碼(或者只是生成一個調用或跳轉到真正的共享庫函數)
順便說一下,你可以使用和適應你的怪異需求musl-libc (它包括一個你可以根據你的需要移植的dlopen
功能)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.