关于gcc:gcc-好玩的-builtin-函数

gcc 好玩的 builtin 函数前言在本篇文章当中次要想给大家介绍一些在 gcc 编译器当中给咱们提供的一些好玩的内嵌函数 (builtin function) 。 __builtin_frame_address应用内嵌函数实现__builtin_frame_address(x) // 其中 x 一个整数这个函数次要是用于失去函数的栈帧的,更具体的来说是失去函数的 rbp (如果是 x86_64 的机器,在 32 位零碎上就是 ebp)的值,也就是栈帧的栈底的值。 咱们当初应用一个例子来验证测试一下: #include <stdio.h>void func_a(){ void* p = __builtin_frame_address(0); printf("fun_a frame address = %p\n", p);}int main(){ void* p = __builtin_frame_address(0); printf("main frame address = %p\n", p); func_a(); return 0;}下面的程序的输入后果如下所示: main frame address = 0x7ffcecdd7a00fun_a frame address = 0x7ffcecdd79d0下面输入的后果就是每个函数的栈帧中栈底 rbp/ebp 寄存器的值,可能你会有疑难,凭什么说这个值就是 rbp 的值。咱们当初来证实一下,咱们能够应用代码获取失去 rbp 的值。 应用内敛汇编实现#include <stdio.h>#include <sys/types.h>u_int64_t rbp;#define frame_address \ asm volatile( \ "movq %%rbp, %0;" \ :"=m"(rbp):: \ ); \ printf("rbp = %p from inline assembly\n", (void*) rbp);void bar(){ void* rbp = __builtin_frame_address(0); printf("rbp = %p\n", rbp); frame_address}int main(){ bar(); return 0;}在下面的程序当中,咱们应用一段宏能够失去寄存器 rbp 的值(在下面的代码当中,咱们应用内敛汇编失去 rbp 的值,并且将这个值存储到变量 rbp 当中),咱们将这个值和 builtin 函数的返回值进行比照,咱们就能够晓得返回的是不是寄存器 rbp 的值了,下面的程序执行后果如下所示: ...

November 20, 2022 · 7 min · jiezi