首页 > 解决方案 > 如何将标签推送到可重定位共享库中的堆栈中,其对象应使用-fPIC编译?

问题描述

我正在使用从汇编代码组装的几个目标文件制作一个可重定位的共享库(所有编译都应该使用 -fPIC 和 -DPIC)。

在我的代码中,我有push label说明。当我使用一切将我的汇编代码组装成一个目标文件时,-fPIC -DPIC一切看起来都很好,但是当我想使用目标文件创建共享库时,我得到了relocation R_X86_64_32S against '.text' can not be used when making a shared object; recompile with -fPIC消息。

我确信问题出在这些push label说明上,因为当我删除它们时,错误就会消失。

关于如何组装它的任何想法?

顺便说一句,我的平台是采用 Intel x86_64 架构的 Linux,编译器gcc采用 GAS 语法。我对 64 位库感兴趣。

标签: assemblyshared-librariesx86-64

解决方案


假设您正在使用 GAS:

lea  label(%rip), %rax
push %rax

没有推送有效地址指令,因此您需要通过寄存器。

请注意,在 64 位 x86 代码中使用 push 立即指令并不是很多理由,因为参数通常不会在堆栈上传递,可能有更好的方法来重写代码。


推荐阅读