我想爲沒有虛擬內存(或者操作系統更精確)的機器編寫一個C程序,而且我遇到了一些與.rodata部分有關的困難,或者更確切地說,去那裏的東西。問題在於,雖然在鏈接期間這些部分被定位在明確定義的地址處,但是當程序進入執行階段時,它正在被重新定位。.rodata搬遷有關的問題
例如:假設我的程序啓動鏈接從0x1000開始,當它被執行時,它應該在0x1000處重新定位在0xff1000。
這些被說,我的問題是,通常進入.rodata的東西是由編譯器(gcc)「硬編碼」,我有點失去說在內存中的.rodata常量,因爲重定位和海灣合作委員會硬編碼地址,以便它們獲得絕對偏移量而不是相對偏移量。
是否有一種方法可以讓.rodata常量具有相對偏移量而不是絕對偏移量。相對而言,我的意思是相對於任何活動的進程寄存器?
它可能就像生成與位置無關的代碼一樣簡單(帶有GCC的'-fPIC')。代碼是否總是重定位到0xff1000?或者它是否可變? – user786653
它可能是可變的。我的意思是現在不是,但你永遠不知道什麼程序加載此代碼。我設法在手動將代碼重定位到它應該在的位置之後解決了這個問題(這實際上是我應該得到的地方,但這太牽強了,調試幾乎不存在)。至於fPIC,我真的不能再測試它了,但是在一個-fPIC編譯的源代碼和一個沒有-fPIC的編譯源之間交叉引用後,它似乎已經奏效了(儘管我不會屏住呼吸,因爲它確實一些非常奇怪的東西) – skyel
你編譯的目標格式是什麼? .rodata,IIRC,包含相對地址。加載器的工作是將它們添加到代碼的基地址並相應地更新.text部分。我寫了自己的操作系統和應用程序加載器,這就是我能記得的。 – Unsigned