猿问

在x86-64 Linux中不再允许32位绝对地址?

在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节不允许.

这种更改的结果是,旧库必须重新编译,遗留程序集代码被破坏。

现在我想问一问:这个变化是什么时候发生的?在什么地方有记录吗?是否有链接器选项使其接受32位绝对地址?


MM们
浏览 767回答 1
1回答
随时随地看视频慕课网APP
我要回答