重定位 R_X86_64_32S 对 `.data' 在制作共享对象时不能使用;使用 gcc 重新编译 -fPIC

Posted

技术标签:

【中文标题】重定位 R_X86_64_32S 对 `.data\' 在制作共享对象时不能使用;使用 gcc 重新编译 -fPIC【英文标题】:relocation R_X86_64_32S against `.data' can not be used when making a shared object; recompile with -fPIC with gcc重定位 R_X86_64_32S 对 `.data' 在制作共享对象时不能使用;使用 gcc 重新编译 -fPIC 【发布时间】:2017-01-04 18:35:55 【问题描述】:

当我使用 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

    我在另一个 linux 发行版中尝试了同样的方法,它运行良好。

    添加-fPIC 没有帮助。 apt-get 也不更新。

    如果您想查看代码:练习中的https://github.com/NEGU93/Compilation.git > Part1。当然是文件 print.s (顺便说一句。当我做 gcc 时,所有 .s 文件都有类似的错误)。

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

【问题讨论】:

32-bit absolute addresses no longer allowed in x86-64 Linux?的可能重复 【参考方案1】:

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

call    printf@PLT

或者你可以尝试用gcc -no-pie编译。

【讨论】:

解决了!我添加了“-no-pie”行并且工作了!非常感谢!有没有办法让它永久化?不用每次都写那行? 不幸的是,它似乎默认为所有现代发行版启用。 -no-pie 很好,把它扔进你的CFLAGS【参考方案2】:

当我试图链接一些用 clang 编译的目标文件和一些用 gcc 编译的目标文件时,我得到了和你一样的错误。我猜这两个编译器在是否生成与位置无关的代码方面有不同的默认设置。

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

【讨论】:

以上是关于重定位 R_X86_64_32S 对 `.data' 在制作共享对象时不能使用;使用 gcc 重新编译 -fPIC的主要内容,如果未能解决你的问题,请参考以下文章

“重定位 R_X86_64_32S 反对”链接错误

内联程序集返回:在创建共享对象时,不能使用针对未定义符号的重定位R_X86_64_32S [重复]

重定位 R_X86_64_PC32 对符号 _ZTISt13runtime_error@@GLIBCXX_3.4 在制作共享对象时不能使用;使用 -fPIC 重新编译

relocation R_X86_64_32S against `.data‘ can not be used when making a PIE object; recompile with -fP

为什么在创建特定于x86_64的共享对象时“无法使用R_X86_64_32”的CMake解决方案?

eclipse编译动态链接库文件报错 relocation R_X86_64_32 against `.data' can not be used when making a shared o