我最近收到了:創建共享目標時爲什麼fPIC絕對需要64位而不是32位平臺?
...對`局部符號」搬遷R_X86_64_32不能使用;使用-fPIC重新編譯
嘗試將程序編譯爲共享庫時發生錯誤。
現在解決這個問題並不困難(用-fPIC重新編譯所有依賴關係),但經過一番研究後發現,這個問題只存在於x86-64平臺上。在32位上,任何依賴於位置的代碼仍然可以通過動態加載程序進行重定位。
最好answer我能找到的是:
86具有的.text遷移的支持(這是當你有 位置dependend代碼會發生什麼)。這種支持是有代價的,即每個包含這種重定位的頁面都基本上是不共享的,即使它位於共享庫中,從而破壞了共享庫的概念。因此,我們決定禁止這種基於AMD64(加上它創建 問題如果該值比需要32位以上,因爲所有的.text relocs只有 有大小「word32」)
但我不覺得這很充足。如果重定位破壞了共享庫的概念,爲什麼它可以在32位平臺上完成?另外,如果需要對ELF格式進行更改以支持64位,那麼爲什麼並非所有的字段都增加以容納?
這可能是一個小問題,但它的動機是這樣的事實:a)有問題的代碼是一個科學代碼,它不會有必要採取性能打擊和b)這個信息是不可能的首先找到!
[編輯: '答案'
@awoodlands answer可能是最好的 '的字面解釋',@servn added一些有用的信息。
在搜索中找到更多有關不同類型的搬遷,我發現this,最終的x86_64 ABI reference(見68頁) ]
我不知道回答你的問題,但你應該知道了'在x86-64(相對於x86-32)中,-fPIC性能降低,因爲它具有更多的寄存器,PC相對尋址以及考慮PIC設計的ABI。我不會說它已經消失了,但是測量一下,你可能會感到驚喜。 – zwol
這似乎是共識,對於無可否認的極大便利的表現來說是一個小小的懲罰。我將不得不親自嘗試。 –
主要問題當然是爲什麼編譯器有一個「強制選項」。 「你沒有說這個魔術字」是一個相當幼稚的遊戲。 – MSalters