因为在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, long c, long d, long e, long f)
{
......
unsigned long **v0 = (unsigned long **)__builtin_apply_arg

本文探讨了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', '三维建模']
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



