在制作共享对象时,不能使用针对`.data'的重定位R_X86_64_32S;使用gcc

时间:2017-01-04 18:35:56

标签: gcc

当我使用gcc编译print.s时出现以下错误:

/usr/bin/ld: /tmp/cc45uyZj.o: relocation R_X86_64_32S against `.data' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
  1. 我在另一个Linux发行版中尝试过相同的功能,但它运行得很好。

  2. 添加-fPIC没有帮助。 apt-get update也没有。

  3. 如果您想在实践>中看到代码:https://github.com/NEGU93/Compilation.git第1部分。当然是文件print.s(顺便说一下。当我做gcc时,所有.s文件都有类似的错误。)

  4. 我想Kali发行版中缺少某些东西,但我不知道它是什么。

2 个答案:

答案 0 :(得分:4)

默认情况下,您的发行版似乎启用-pie(请检查gcc -v输出),但您的程序集与位置无关。尝试编译-fPIC下的示例.c文件,看看它是如何生成调用的。在你的情况下它应该是

call    printf@PLT

或者您可以尝试使用gcc -no-pie进行编译。

答案 1 :(得分:0)

当尝试链接使用clang编译的某些目标文件和使用gcc编译的某些目标文件时,出现与您相同的错误。我猜这两个编译器在是否生成位置无关代码方面都有不同的默认设置。

因此,请确保您不会在项目的一部分中意外使用错误的编译器。