当我尝试在64位FreeBSD中编译C应用程序时出现以下错误:



什么是R_X86_64_32S重定位,什么是R_X86_64_64

我已经搜索了该错误,并且可能是原因-如果有人能说出R_X86_64_32S的真正含义,那就太好了。

最佳答案

R_X86_64_32SR_X86_64_64是重定位类型的名称,用于为amd64架构编译的代码。您可以在amd64 ABI中查找所有这些内容。
据此,R_X86_64_64细分为:

  • R_X86_64-所有名称都以
  • 开头
  • 64-直接64位重定位

  • R_X86_64_32S可以:
  • R_X86_64-前缀
  • 32S-将值截断为32位并符号扩展

  • 在两种情况下,这基本上表示“此重定位所指向的符号的值加上任何加数”。对于R_X86_64_32S,链接器然后验证生成的值是否符号扩展为原始的64位值。

    现在,在可执行文件中,为代码和数据段指定了指定的虚拟基址。可执行代码不共享,每个可执行文件都有自己的新地址空间。这意味着编译器确切知道数据节将在哪里,并可以直接引用它。另一方面,库只能知道它们的数据段与基地址之间有指定的偏移量。该基地址的值只能在运行时知道。因此,所有库必须使用无论位置如何都可以执行的代码(称为位置无关代码(简称PIC))生成。

    现在,当要解决您的问题时,错误消息说明了一切。

    关于c - R_X86_64_32S和R_X86_64_64重定位是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6093547/

    10-13 05:08