簡體   English   中英

使用gcc編譯PowerPC二進制文件並限制可用的寄存器

[英]Compiling PowerPC binary with gcc and restrict useable registers

我有一個運行軟件的PowerPC設備,我想通過插入一些自己的代碼部分來修改這個軟件。

我可以輕松編寫自己的匯編程序代碼,將其放在RAM中未使用的區域中,將“官方”代碼中的任何指令替換為b 0x80001234 ,其中0x80001234是加載我自己的代碼擴展的RAM地址。

但是,當我使用powerpc-eabi-gcc編譯C代碼時,gcc假定它編譯一個完整的程序,而不僅僅是“代碼部分”要插入到正在運行的程序中。

這導致了一個問題:主程序使用一些CPU寄存器來存儲數據,當我只是將我的擴展名復制到它中時,它會混亂以前的內容。

例如,如果我要插入代碼的主程序使用寄存器5和該代碼塊中的寄存器8,如果我自己的代碼寫入r5或r8,程序將崩潰。 然后我需要將編譯后的二進制文件轉換回匯編代碼,編輯相應的寄存器以使用除r5和r8之外的寄存器,然后再次編譯該ASM源。

我現在正在尋找的是ppc-gcc的一個選項,它告訴它“在創建字節碼時永遠不會使用PPC寄存器r5和r8”。

這是可能的,還是我需要繼續自己爬行ASM代碼,用其他寄存器替換所有“使用過的”寄存器?

你應該想到另一種方法來解決這個問題。

有一個gcc擴展來保留寄存器作為全局變量

register int *foo asm ("r12");

請注意,如果您使用此擴展程序,您的程序將不再向您正在使用的操作系統的ABI確認。 這意味着您無法調用任何庫函數,而不會有程序崩潰,覆蓋變量或崩潰的風險。

暫無
暫無

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

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