如何将标签推入可重定位共享库的堆栈中,其对象应使用 -fPIC 进行编译?

mas*_*sec 0 assembly x86-64 shared-libraries

我正在使用从汇编代码组装的多个目标文件来制作可重定位共享库(所有编译都应使用 -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 位库感兴趣。

Ros*_*dge 5

假设您使用的是 GAS:

lea  label(%rip), %rax
push %rax
Run Code Online (Sandbox Code Playgroud)

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

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