在x86-64 Linux中不再允許32位絕對(duì)地址?64位Linux默認(rèn)使用小內(nèi)存模型,將所有代碼和靜態(tài)數(shù)據(jù)都置于2GB的地址限制之下。這確保您可以使用32位絕對(duì)地址.舊版本的GCC為靜態(tài)數(shù)組使用32位絕對(duì)地址,以節(jié)省用于相對(duì)地址計(jì)算的額外指令。然而,這已經(jīng)行不通了。如果我試圖在程序集中創(chuàng)建一個(gè)32位絕對(duì)地址,就會(huì)得到鏈接器錯(cuò)誤:“在創(chuàng)建共享對(duì)象時(shí)不能使用針對(duì)`.data‘的重新定位R_X86_64_32S;使用-FPIC重新編譯”。當(dāng)然,這個(gè)錯(cuò)誤消息是誤導(dǎo)的,因?yàn)槲覜]有創(chuàng)建一個(gè)共享對(duì)象,而且-FPIC也沒有幫助。到目前為止,我發(fā)現(xiàn)的是:GCC版本4.8.5使用32位絕對(duì)地址作為靜態(tài)數(shù)組,GCC版本6.3.0沒有。第5版可能也沒有。binutils 2.24中的鏈接器允許32位絕對(duì)地址,第2.28節(jié)不允許.這種更改的結(jié)果是,舊庫(kù)必須重新編譯,遺留程序集代碼被破壞?,F(xiàn)在我想問(wèn)一問(wèn):這個(gè)變化是什么時(shí)候發(fā)生的?在什么地方有記錄嗎?是否有鏈接器選項(xiàng)使其接受32位絕對(duì)地址?
在x86-64 Linux中不再允許32位絕對(duì)地址?
MM們
2019-06-05 10:48:37