GCC编译器内置函数

__builtin_return_address(0)是一个内置函数,它的作用是返回当前函数被调用后,退出的地址。也就是说,它可以得到当前函数的返回地址。例如:

#include 

void foo()
{
    printf("foo's return address: %p\n", __builtin_return_address(0));
}

void bar()
{
    foo();
}

int main()
{
    bar();
    return 0;
}

输出:

foo's return address: 0x4005a9

这里,0x4005a9就是foo函数被bar函数调用后,返回到bar函数的地址。

GCC编译器提供了很多内置函数,它们可以用来实现一些特殊的功能,比如位运算、内存操作、类型转换等。这些内置函数有两种形式:一种是以__builtin_为前缀的,另一种是没有前缀的。例如:

__builtin_clz(x):返回x的二进制表示中,从最高位开始连续的0的个数。
__builtin_popcount(x):返回x的二进制表示中,1的个数。
__builtin_expect(x, y):告诉编译器,x的值很可能等于y,用于优化分支预测。
memcpy(dest, src, n):把src指向的n个字节复制到dest指向的内存区域。
 

GCC编译器提供了一些内置函数可以用来在程序中插入断点、打印调试信息、检查内存错误等。例如:

__builtin_trap():在程序中产生一个陷阱,使得程序停止执行,方便调试。
__builtin_printf(format, …):类似于printf函数,但是直接输出到标准输出,不经过库函数的缓冲区。
__builtin___clear_cache(begin, end):清除begin和end之间的指令缓存,用于修改代码后重新执行。


另外,如果想要使用更强大的调试工具,可以使用gdb。gdb可以让你单步执行程序,查看变量的值,设置断点,跟踪函数调用等。要使用gdb,你需要在编译时加上-g选项,以便在可执行文件中嵌入更多的调试信息。

__builtin_return_address(0)和__builtin_return_address(1)都是GCC编译器提供的内置函数,用于获取函数的返回地址。返回地址是指函数执行完毕后,要跳转回去的指令地址。区别在于:

  • __builtin_return_address(0)返回当前函数的返回地址,即当前函数被调用时,调用者的下一条指令地址。
  • __builtin_return_address(1)返回当前函数的调用者的返回地址,即当前函数的调用者被调用时,它的调用者的下一条指令地址。

例如,如果有这样的函数调用链:

main -> foo -> bar -> baz

那么,在baz函数中:

  • __builtin_return_address(0)返回bar函数中,调用baz后的下一条指令地址。
  • __builtin_return_address(1)返回foo函数中,调用bar后的下一条指令地址。

你可能感兴趣的:(我的博客,gcc)