我正在開發一個操作系統,我需要加載一些模塊之前,分頁設置。因此,由於此時沒有設置分頁,我需要將程序中的所有符號重新定位到物理地址。我的問題是,不是所有的符號都可以在符號表中找到,並且並非所有的重定位信息都可以在rel.text中找到。我怎樣才能讓GCC導出所有符號數據?如何獲得GCC導出所有符號到輸出文件
回答
真的你的問題是關於鏈接器。答案取決於你使用的鏈接器。
如果是gcc下的標準鏈接器ld
,請嘗試「-Wl,-r」選項。
當然,任何需要重定位的地方都會在重定位表中。還有什麼可以加載?無論是否啓用分頁,重定位的工作原理都完全相同 - 二進制文件中絕對位置的條目以偏移量列出,然後由加載軟件處理。其他一切都應該沒有搬遷的罰款。
請注意,符號表對解決自身中的重定位沒有意義,因爲它只給出符號的位置。
您是否想過操作系統本身的符號?如果是這樣,那麼確實是以適當的方式從您的操作系統中導出符號的情況。 Linux有EXPORT_SYMBOL(名稱),它在內核中構建一個符號表。 [請注意,這不是由gcc
或ld
生成的符號,而是由宏建立並在內核中處理的符號。
編輯以澄清,因爲「註釋」中的空間不足: 「重定位」有兩種類型:內部 - 您可以在自己的模塊中對事物進行絕對引用。指向字符串的指針,函數的poitners,switch語句的跳轉表等等 - 這些應該只是一個將當前值與二進制實際位置的偏移量(當然是虛擬地址)相加的問題。另一個是「外部引用」,比如當你的模塊調用時,比如說spinlock()
- 這不是在模塊內部實現的,所以它會有一個「外部引用」。在這種情況下,將會有一個帶有「自旋鎖」的重定位入口作爲名稱以及對自旋鎖的調用進入模塊的位置的偏移量。現在你顯然需要一個符號表來查找內核中「spinlock」的位置[如果你想變得非常複雜,允許moduels引用其他模塊,但是我會離開它,直到你有一個模塊加載OK第一!]。
我有點困惑,因爲我認爲符號索引存儲在reloc_info中。重定位條目中唯一的其他數據是應用重定位的地址。所以你必須通過查看符號表並找到該符號的值,才能得到rel_offset的地址? – user1454902
我不是100%確定你正在努力解決什麼(並且要嘗試爬上工作崗位,所以今晚將不得不回覆你)。我已經對我的原始答案進行了編輯,試圖澄清兩件搬遷事件。如果這不包括它,那麼請更詳細地解釋一下,或許用一個例子來說明你正在努力解決的問題。 –
- 1. 在GCC中,如何導出共享庫的所有typeinfo符號而不導出所有符號?
- 2. 如何從調試符號中導出所有文件路徑
- 3. 如何獲取庫導出的所有符號的列表?
- 4. 如何獲得導出文件(telerik RadGrid導出)的路徑?
- 5. 如何獲得所需的輸出?
- 6. 如何獲得所需的輸出?
- 7. 如何獲得所需的輸出
- 8. 如何在輸入文件中獲得輸出文件格式
- 9. 獲得所有其他行空輸出
- 10. 文件沒有得到輸出
- 11. 沒有得到xml文件輸出
- 12. Linux的所有輸出到文件
- 13. 寫入所有輸出到文件
- 14. 如何捕獲dvdauthor輸出到文件
- 15. 如何獲得輸出發送到標準輸出到字符串
- 16. 如何將存儲過程輸出導出到文本文件
- 17. Bash輸出所有標準輸出到控制檯和文件
- 18. 沒有得到在HTML文件所需的輸出
- 19. 沒有得到所需的輸出
- 20. 沒有得到所需的輸出
- 21. 沒有得到所需的輸出
- 22. 沒有得到所需的輸出
- 23. 我如何獲得symfony2導出到Excel
- 24. 如何獲得與輸出
- 25. 如何獲得輸出proc_open()
- 26. 如何獲得輸出?
- 27. 如何獲得R輸出到CSV文件?
- 28. 如何獲得shell命令輸出到ansible變量文件
- 29. 如何獲得tweepy輸出到Excel?
- 30. 如何在gcc中獲得完整的彙編程序輸出?
重定位表必須包含足夠的信息來將可執行文件重定位到任意位置。這些信息不需要涵蓋所有符號。例如,您的本地變量不會重新定位。 –
您是否嘗試使用-fPIC編譯位置獨立的代碼? –