__builtin_apply_args() intrisic函数在不同架构上的实现

本文探讨了GCC的内置函数__builtin_apply_args()在MIPS, ARM, X86-64, RISCV以及Xtensa五种不同架构上的实现。文章详细分析了各架构如何构造栈帧,特别是在X86-64上的特殊性,以及RISCV在寄存器传参方面的优势。Xtensa架构由于其独特的寄存器窗口概念,使得__builtin_apply_args()的实现与众不同。文章总结了各种架构的共性和特性,强调了GCC功能扩展在不同架构间的适用性。" 116433451,10543220,MATLAB生成三维Shepp-Logan头骨模型,"['MATLAB', '图像处理', '医学图像', 'Shepp-Logan', '三维建模']
摘要由CSDN通过智能技术生成

因为在c中,函数调用的环境是由编译器创建的,语言本身除了提供形式上的调用关系之外,并不提供对函数调用栈的访问,如果想对堆栈进行结构化的解释,需要编译器提供支持,gcc提供了访问堆栈的扩展接口,它们包括__builtin_apply_args(), __builtin_apply()和__builtin_return()几个主要的函数,gcc扩展的这类函数可以帮助我们hack进函数调用的内部,做到单靠C语言本身完不成的工作。下面分析一下MIPS, ARM, X86和RISCV,Xtensa五种架构下,__builtin_apply_args对参数帧的构造和hack参数的方式.

MIPS

从图中可以看到,__builtin_apply_args()构造了两个参数帧结构,所以,可以有两种方式构造栈帧

void hack1(long a, long b, long c, long d, long e, long f)
{
    ......
    unsigned long **v0 = (unsigned long **)__builtin_apply_args();
    para0 = v[1];
    para1 = v[2];
    para2 = v[3];
    para3 = v[4];
    para4 = v[0][4];
    para5 = v[0][5];
    
    ...... 
}
void hack2(long a, long b,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papaofdoudou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值