重定位 R_X86_64_32S 对 `.data' 的使用在制作共享对象时无法使用;请使用 gcc 重新编译并加上 -fPIC。

7
使用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 在Practice > Part1目录下。当我使用gcc编译所有.s文件时,都会出现类似的错误(顺便说一下,print.s是其中之一)。

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


2个回答

14

看起来您的发行版默认启用了 -pie(检查 gcc -v 输出),但您的汇编代码不是位置无关的。尝试在 -fPIC 下编译一个示例 .c 文件,看看它如何生成调用。在您的情况下应该是

call    printf@PLT

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


2
解决了!我添加了“-no-pie”这一行,它起作用了!非常感谢!但是有没有办法使其永久化?不需要每次都写那一行吗? - J Agustin Barrachina
不幸的是,所有现代发行版似乎默认启用了该选项。-no-pie可以,只需将其加入到你的CFLAGS中即可。 - yugr

2
当我试图链接一些使用clang编译的目标文件和一些使用gcc编译的目标文件时,我遇到了与您相同的错误。我猜这两个编译器在是否生成位置无关代码方面具有不同的默认设置。因此,请确保您没有意外地在项目的某个部分使用了错误的编译器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接