Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在可重定位共享库中推送堆栈中的标签,其对象应使用-fPIC编译?_Assembly_Shared Libraries_X86 64 - Fatal编程技术网

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

Assembly 如何在可重定位共享库中推送堆栈中的标签,其对象应使用-fPIC编译?,assembly,shared-libraries,x86-64,Assembly,Shared Libraries,X86 64,我正在使用由汇编代码组装的多个对象文件创建一个可重新定位的共享库(所有编译都应该使用-fPIC和-DPIC) 在我的代码中,我有push label说明。当我使用-fPIC-DPIC将我的汇编代码组装成一个目标文件时,一切看起来都很好,但是当我想使用目标文件创建共享库时,我得到了针对.text的重定位R_X86_64_32S;使用-fPIC消息重新编译 我确信问题出在这些推标签指令上,因为当我删除它们时,错误消失了 你知道我怎样才能把它组装好吗 顺便说一下,我的平台是采用英特尔x86_64体系结

我正在使用由汇编代码组装的多个对象文件创建一个可重新定位的共享库(所有编译都应该使用-fPIC和-DPIC)

在我的代码中,我有
push label
说明。当我使用
-fPIC-DPIC
将我的汇编代码组装成一个目标文件时,一切看起来都很好,但是当我想使用目标文件创建共享库时,我得到了针对.text的
重定位R_X86_64_32S;使用-fPIC
消息重新编译

我确信问题出在这些
推标签
指令上,因为当我删除它们时,错误消失了

你知道我怎样才能把它组装好吗

顺便说一下,我的平台是采用英特尔x86_64体系结构的Linux,编译器是采用GAS语法的
gcc
。我对64位库感兴趣。

而不是

push label
使用


这避免了对
标签的绝对引用
,将其替换为相对引用,如果在同一共享对象中定义了
标签
,则可以在位置独立的代码中解析相对引用。确切的语法取决于您的汇编器,此语法至少应该在nasm上工作。

假设您使用的是GAS:

lea  label(%rip), %rax
push %rax
没有有效地址指令,所以你需要通过寄存器


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

请注意,程序集是组装的,而不是编译的。错误的理解可能会让读者感到困惑。你应该用你正在使用的汇编程序的名称更新你的问题,因为根据汇编程序的不同,推标签有两种不同的解释。谢谢。不幸的是,我希望将地址推送到堆栈,而不是相对地址。@masec实际地址被推送到堆栈上。
lea-rax,[rel-label]
的作用是将指令流中的相对地址转换为
rax
@masec中的绝对地址:阅读RIP相对地址的工作原理。RIP relative LEA是将静态位置的地址获取到x86-64寄存器中的最佳方法,除非您正在生成位置相关的可执行文件,以便可以使用
mov r32、imm32
。就像罗斯说的,你确定你应该按地址吗?只有当您已经将6个整数/指针参数放入寄存器rdi..r9时,x86-64系统V ABI才会在堆栈上传递整数。是的,我想我可能需要一个寄存器。我知道这不是一个很好的代码。事实上,我正在强化汇编代码,所以这完全是黑客行为,而不是一个有良好文档记录的汇编编程。顺便说一下,谢谢。
lea  label(%rip), %rax
push %rax