为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MM们 2019-06-05 10:48:37
在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位绝对地址?
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 766 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信