在x86-64 Linux中不再允許32位絕對地址?64位Linux默認使用小內存模型,將所有代碼和靜態數據都置于2GB的地址限制之下。這確保您可以使用32位絕對地址.舊版本的GCC為靜態數組使用32位絕對地址,以節省用于相對地址計算的額外指令。然而,這已經行不通了。如果我試圖在程序集中創建一個32位絕對地址,就會得到鏈接器錯誤:“在創建共享對象時不能使用針對`.data‘的重新定位R_X86_64_32S;使用-FPIC重新編譯”。當然,這個錯誤消息是誤導的,因為我沒有創建一個共享對象,而且-FPIC也沒有幫助。到目前為止,我發現的是:GCC版本4.8.5使用32位絕對地址作為靜態數組,GCC版本6.3.0沒有。第5版可能也沒有。binutils 2.24中的鏈接器允許32位絕對地址,第2.28節不允許.這種更改的結果是,舊庫必須重新編譯,遺留程序集代碼被破壞?,F在我想問一問:這個變化是什么時候發生的?在什么地方有記錄嗎?是否有鏈接器選項使其接受32位絕對地址?
- 1 回答
- 0 關注
- 791 瀏覽
添加回答
舉報
0/150
提交
取消