2013-01-21 34 views
2

我正在開發一個操作系統,我需要加載一些模塊之前,分頁設置。因此,由於此時沒有設置分頁,我需要將程序中的所有符號重新定位到物理地址。我的問題是,不是所有的符號都可以在符號表中找到,並且並非所有的重定位信息都可以在rel.text中找到。我怎樣才能讓GCC導出所有符號數據?如何獲得GCC導出所有符號到輸出文件

+0

重定位表必須包含足夠的信息來將可執行文件重定位到任意位置。這些信息不需要涵蓋所有符號。例如,您的本地變量不會重新定位。 –

+0

您是否嘗試使用-fPIC編譯位置獨立的代碼? –

回答

0

真的你的問題是關於鏈接器。答案取決於你使用的鏈接器。

如果是gcc下的標準鏈接器ld,請嘗試「-Wl,-r」選項。

2

當然,任何需要重定位的地方都會在重定位表中。還有什麼可以加載?無論是否啓用分頁,重定位的工作原理都完全相同 - 二進制文件中絕對位置的條目以偏移量列出,然後由加載軟件處理。其他一切都應該沒有搬遷的罰款。

請注意,符號表對解決自身中的重定位沒有意義,因爲它只給出符號的位置。

您是否想過操作系統本身的符號?如果是這樣,那麼確實是以適當的方式從您的操作系統中導出符號的情況。 Linux有EXPORT_SYMBOL(名稱),它在內核中構建一個符號表。 [請注意,這不是由gccld生成的符號,而是由宏建立並在內核中處理的符號。

編輯以澄清,因爲「註釋」中的空間不足: 「重定位」有兩種類型:內部 - 您可以在自己的模塊中對事物進行絕對引用。指向字符串的指針,函數的poitners,switch語句的跳轉表等等 - 這些應該只是一個將當前值與二進制實際位置的偏移量(當然是虛擬地址)相加的問題。另一個是「外部引用」,比如當你的模塊調用時,比如說spinlock() - 這不是在模塊內部實現的,所以它會有一個「外部引用」。在這種情況下,將會有一個帶有「自旋鎖」的重定位入口作爲名稱以及對自旋鎖的調用進入模塊的位置的偏移量。現在你顯然需要一個符號表來查找內核中「spinlock」的位置[如果你想變得非常複雜,允許moduels引用其他模塊,但是我會離開它,直到你有一個模塊加載OK第一!]。

+0

我有點困惑,因爲我認爲符號索引存儲在reloc_info中。重定位條目中唯一的其他數據是應用重定位的地址。所以你必須通過查看符號表並找到該符號的值,才能得到rel_offset的地址? – user1454902

+0

我不是100%確定你正在努力解決什麼(並且要嘗試爬上工作崗位,所以今晚將不得不回覆你)。我已經對我的原始答案進行了編輯,試圖澄清兩件搬遷事件。如果這不包括它,那麼請更詳細地解釋一下,或許用一個例子來說明你正在努力解決的問題。 –