GCC返回ARM体系结构中调用函数的地址

Agn*_*kas 16 c stack gcc arm

我很好奇为什么__builtin_return_address()在ARM中不支持除0之外的其他参数?这是一个问题,不知何故你不能从ARM堆栈中推断出调用函数地址?或者是其他东西 ?

谢谢

J. *_*mon 12

根据这篇文章< http://codingrelic.geekhold.com/2009/05/pre-mortem-backtracing.html >,

还有一些架构,包括我心爱的MIPS,只能__builtin_return_address(0)运行.MIPS没有帧指针,因此难以向上走回堆栈.帧0可以直接使用返回地址寄存器.如果ARM也没有帧指针,这将解释限制.

另见http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html.

  • 在ARM上,返回地址在寄存器"R14"中传递,被调用者在调用另一个函数时保存它.因此,即使使用帧指针,也无法保证返回地址始终存储在堆栈中. (6认同)
  • 实际上,当返回地址被调用者保存而不是通过调用指令保存在堆栈中时,通常不可能找到它.应该有一种使用dwarf2展开/调试数据的方法,但这需要`__builtin_return_address`来调用一个重量级的展开库调用,而不是一个简单的内置... (3认同)