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

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

失败并显示以下错误:



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

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

最佳答案

我发现a nice and detailed explanation可以归结为:

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