2011-08-17 74 views
3

我想爲沒有虛擬內存(或者操作系統更精確)的機器編寫一個C程序,而且我遇到了一些與.rodata部分有關的困難,或者更確切地說,去那裏的東西。問題在於,雖然在鏈接期間這些部分被定位在明確定義的地址處,但是當程序進入執行階段時,它正在被重新定位。.rodata搬遷有關的問題

例如:假設我的程序啓動鏈接從0x1000開始,當它被執行時,它應該在0x1000處重新定位在0xff1000。

這些被說,我的問題是,通常進入.rodata的東西是由編譯器(gcc)「硬編碼」,我有點失去說在內存中的.rodata常量,因爲重定位和海灣合作委員會硬編碼地址,以便它們獲得絕對偏移量而不是相對偏移量。

是否有一種方法可以讓.rodata常量具有相對偏移量而不是絕對偏移量。相對而言,我的意思是相對於任何活動的進程寄存器?

+0

它可能就像生成與位置無關的代碼一樣簡單(帶有GCC的'-fPIC')。代碼是否總是重定位到0xff1000?或者它是否可變? – user786653

+0

它可能是可變的。我的意思是現在不是,但你永遠不知道什麼程序加載此代碼。我設法在手動將代碼重定位到它應該在的位置之後解決了這個問題(這實際上是我應該得到的地方,但這太牽強了,調試幾乎不存在)。至於fPIC,我真的不能再測試它了,但是在一個-fPIC編譯的源代碼和一個沒有-fPIC的編譯源之間交叉引用後,它似乎已經奏效了(儘管我不會屏住呼吸,因爲它確實一些非常奇怪的東西) – skyel

+0

你編譯的目標格式是什麼? .rodata,IIRC,包含相對地址。加載器的工作是將它們添加到代碼的基地址並相應地更新.text部分。我寫了自己的操作系統和應用程序加載器,這就是我能記得的。 – Unsigned

回答

1

根據體系結構,.rodata可能會被仲裁地重定位到特定的內存區域(例如ROM)。這種信息可以在您的機牀數據表中找到。 如果您在這種情況下,您必須告訴鏈接使用鏈接器腳本將.rodata部分放在正確的區域。 鏈接腳本如何GCC工作的一個很好的概述,可以在這裏找到:

http://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html

此外,你可以很容易地找到了很多在互聯網上架構相關的鏈接腳本。

希望有幫助!