当前位置: 首页 > 面试题库 >

与位置无关的代码的区别:x86与x86-64

诸葛绍元
2023-03-14
问题内容

我最近正在构建针对x86-64架构的特定共享库(ELF),如下所示:

g++ -o binary.so -shared --no-undefined ... -lfoo -lbar

失败并显示以下错误:

创建共享库时,不能使用针对“本地符号”的R_X86_64_32重定位;用-fPIC重新编译

当然,这意味着我需要将其重建为位置无关的代码,因此适合链接到共享库。

但这在具有完全相同的构建参数的x86上效果很好。所以问题是,x86上的重定位与x86-64有何不同?为什么我不需要-fPIC在前一个上进行编译?


问题答案:

我找到了一个很好而详细的解释,可以归结为:

  1. x86-64使用IP相对偏移量来加载全局数据,而x86-32无法使用它来引用全局偏移量。
  2. IP相对偏移不适用于共享库,因为可以覆盖全局符号,因此,如果不使用PIC构建,x86-64就会崩溃。
  3. 如果使用PIC构建了x86-64,则IP相对偏移取消引用现在会产生 一个指向GOT entry的指针 ,然后将其取消引用。
  4. 但是,x86-32 已经 使用了全局偏移量的取消引用,因此将其直接转换为GOT条目。


 类似资料:
  • 问题内容: 据我所知,x86汇编代码在很大程度上受寄存器数量的限制。 当我了解到在Linux上要创建一个.so文件时,必须为gcc指定-fPIC命令行参数才能创建与位置无关的代码,我不敢首先相信它。 据我所知,elf文件格式支持重定位,就像-在我看来更好-Windows DLL系统可以工作:在Windows上,链接器在DLL中重新定位所有偏移量(如果有必要)。 我认为加载SO文件或DLL文件所需的

  • 本文向大家介绍替代密码技术与换位密码技术的区别,包括了替代密码技术与换位密码技术的区别的使用技巧和注意事项,需要的朋友参考一下 替代密码技术 替代密码技术是一种传统的密文技术,用于将纯文本加密为密文。在这种技术中,每个字符都用其他字符/数字或其他符号代替。此技术可更改字符的身份,但不会更改其位置。 换位密码技术 换位密码技术也是一种传统的密文技术,用于将纯文本加密为密文。在此技术中,每个字符位置都

  • 问题内容: 我想分解一下我拥有的可引导x86磁盘的MBR(前512个字节)。我已将MBR复制到使用 对可以反汇编文件的Linux实用程序有何建议? 问题答案: 您可以使用objdump。根据本文的语法为:

  • 本文向大家介绍title与h1的区别、b与strong的区别、i与em的区别?相关面试题,主要包含被问及title与h1的区别、b与strong的区别、i与em的区别?时的应答技巧和注意事项,需要的朋友参考一下 title 是 网页标题标签 h1 是文本标签 默认与word的h1相似为最大的标题显示 b 为文本加粗标签 与word的加粗功能相似 strong 为强调语气, 也是为文本加粗 与b标签

  • 本文向大家介绍Intel x86 Assembly& Microarchitecture 64位Windows,包括了Intel x86 Assembly& Microarchitecture 64位Windows的使用技巧和注意事项,需要的朋友参考一下 示例 参数 前4个参数按顺序传递RCX,RDX,R8和R9。XMM0至XMM3用于传递浮点参数。 任何其他参数都在堆栈上传递。 大于64位的参数

  • 在上一章我们了解到Windows GDI位图对象(也称为与设备相关的位图,或DDB)有许多程序设计用途。但是我并没有展示把这些位图储存到磁盘文件或把它们加载内存的方法。这是以前在Windows中使用的方法,现在根本不用了。因为位图的位格式相当依赖于设备,所以DDB不适用于图像交换。DDB内没有色彩对照表来指定位图的位与色彩之间的联系。DDB只有在Windows开机到关机的生命期内被建立和清除时才有