簡體   English   中英

如何讓GCC將.text段編譯為ELF二進制文件中的可寫?

[英]How can I make GCC compile the .text section as writable in an ELF binary?

我希望能夠動態更改我正在使用的庫中的可執行代碼。 從本質上講,如果不需要,我想動態地刪除某些功能。

但是,我使用的庫的.text部分是不可寫的(大多數程序都是如此)。 我有庫的源代碼,因此希望使用GCC將其編譯為可寫。

有沒有辦法做到這一點?

在一般意義上, mprotectsys/mman.h下的mprotect選擇(在POSIX符合系統上)(請查看http://linux.die.net/man/2/mprotect )。 只需獲取進程可執行部分的地址和系統頁數,然后調用mprotect來請求權限權限; 寫信給它; 然后,再次調用mprotect以釋放寫入權限。

然而,如果這意味着要在低級別的程序,其中速度是絕對重要的(或mprotect不可用),那么你要編譯其圖書館.text段寫與調用mprotect最有可能發出一個翻譯后援緩沖區(TLB)刷新(特別是在多處理器環境中)會導致瓶頸。 如果特定系統通過分頁使用硬件保護(幾乎所有都是現在),則更改保護的唯一方法是執行TLB刷新,必須在每個引用的頁面上執行,引用的頁面表(頁面組),引用頁面目錄(頁表組)和每個處理器。 最重要的是,這必須在環0中執行,這需要一個系統調用,它只是將櫻桃放在頂部以便開銷。

在后一種情況下,最簡單的解決方案將是正常編譯庫中,然后objcopy與它--writable-text (如由ggiroux提到的)。

另一種解決方案是自己定義鏈接器映射文件linker.ld 然后,您可以明確指定任何部分的權限。 它不太復雜; 如果系統依賴。 請參閱http://www.math.utah.edu/docs/info/ld_3.html上的文檔。 您還可以查看系統提供的linker.ld文件並從那里進行修改。 傳遞-Wl,--verbose到gcc將指示鏈接器吐出所有相關文件(包括其默認的linker.ld),然后您可以在其中修改.text部分的權限並使用新的重新編譯庫(永遠) linker.ld文件。

總而言之,我的建議是在最后一段中指出並使用略微修改的鏈接描述文件編譯您的庫。

在編譯的庫上嘗試objcopy --writable-text ,根據它應該使用的文檔.text可寫。

我找到的最簡單的方法(binutils 2.22)是與-N鏈接可以通過gcc -XN傳遞給gcc

可能最好的方法是使用特定於系統的API來更改要修改的內存的可寫性,修改它,然后將其更改回來。

在unix系列系統上,您需要查看mprotect 請記住,它處理的是您系統頁面大小的倍數的塊。 可能4096,可能需要四舍五入。

暫無
暫無

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

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