2015-05-22 68 views

回答

0

我從ARM Linux的新聞組下面的回答: http://lists.infradead.org/pipermail/linux-arm-kernel/2015-May/345809.html

下用來編譯內核的配置,只有那些搬遷的 小部分將永遠不會被GCC發出。對於 實例,由於我們正在構建不帶-fpic的許多GOT和PLT 相關的將不會發生。而且,由於模塊沒有共享 庫,但只是部分鏈接的目標文件,運行時鏈接 實際上類似於靜態鏈接,而非類似 動態鏈接。 (不支持諸如ELF標準定義的跳轉目標或符號搶佔的惰性分辨率 )。 此外,雖然文本重定位通常在用戶區中被避免,因爲它們擊敗了代碼頁的共享,但這不是問題內核爲 。

所以原因是因爲內核模塊的GCC編譯將只輸出這些重定位。我希望GCC ARM維護人員知道這...

0

ARM手冊是爲所有ELF文件;這包括'C'編譯器在鏈接之前的輸出。 130重新安置類型適用於各種情況;模塊加載器只處理它們的一個子集。對於共享庫和內核模塊,最終輸出不知道它的最終地址,但它知道所有函數/數據在哪裏相對於彼此。絕對重定位需要處理。

它不會嘗試將'.o'文件鏈接在一起以創建'.ko'。這通過ld完成,它將處理更多的重定位類型,但可能還不是全部。 規範意味着全球完整。目標CPU可能不需要某種類型的重定位(例如某些非常舊的ARM1 26位)。

+0

謝謝,但我問爲什麼Linux專門選擇那些實現。我問的原因是因爲我看到另一個系統選擇實施相同的重定位子集,我想知道這些工程師是否從Linux中拿走了它,或者是否有選擇這些重定位的獨立原因。 – Yifan

+0

因爲如果您重新定位圖像的基礎,那麼這些是您需要實施的。相對的東西不需要重新定位。 –

相關問題