Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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
Linux $gp、.cLoad和MIPS上的位置独立性_Linux_Assembly_Mips - Fatal编程技术网

Linux $gp、.cLoad和MIPS上的位置独立性

Linux $gp、.cLoad和MIPS上的位置独立性,linux,assembly,mips,Linux,Assembly,Mips,我正在阅读关于Linux上MIPS上PIC实现的文章。它说: 存储在$gp寄存器(又名$28)中的全局指针是被调用方保存的寄存器 政府也这么说 然而,根据他们的说法,当在函数序言中使用.cpload指令时,它会在不保存之前的$gp值的情况下对其进行重击。当使用.cprestore时,它会将当前$gp保存到堆栈帧,而不是函数入口处的$gp值。.cprestore对jal/jalr的效果也是一样的:一旦被调用方返回,它就会恢复$gp——假设被调用方可能已经将其击倒 最后,函数结尾中没有关于$gp的内

我正在阅读关于Linux上MIPS上PIC实现的文章。它说:

存储在$gp寄存器(又名$28)中的全局指针是被调用方保存的寄存器

政府也这么说

然而,根据他们的说法,当在函数序言中使用
.cpload
指令时,它会在不保存之前的$gp值的情况下对其进行重击。当使用
.cprestore
时,它会将当前$gp保存到堆栈帧,而不是函数入口处的$gp值。
.cprestore
jal
/
jalr
的效果也是一样的:一旦被调用方返回,它就会恢复$gp——假设被调用方可能已经将其击倒

最后,函数结尾中没有关于$gp的内容


总的来说,听起来不像是被叫人保存的登记簿。听起来像是来电者保存的登记簿。我在这里误解了什么?

MIPS上的Linux程序是否可以编译为pic。若编译为pic,那个么它们必须使用“abicalls”,它的行为和no-abicalls约定略有不同

从“SYSTEM V应用程序二进制接口-MIPS处理器补充第3版”的“位置独立功能序言”部分,我们可以引用:

计算gp后,函数分配本地堆栈空间并将gp保存在堆栈上,以便在后续函数调用后恢复。换句话说,gp是一个调用方保存的寄存器

下图中的代码演示了与位置无关的函数序言_gp_disp表示函数开头和全局偏移量表之间的偏移量

name:
   la gp, _gp_disp
   addu gp, gp, t9
   addiu sp, sp, –64
   sw gp, 32(sp)

总之,如果您使用的是
-mabicalls
,那么
gp
将在所有需要全局符号的函数开始时计算(除了一些例外),此外,调用abi代码的任何代码(abi或非abi)都将确保被调用的函数地址存储在
t9

中,因此,基本上,Linux/MIPS ABI轻视供应商建议的约定:)酷。