Ubuntu x86_64下System V ABI返回地址所属栈帧的技术疑问
关于x86_64栈帧中返回地址归属的疑问解答
系统环境
- 架构:x86_64
- 操作系统:Ubuntu 22.04.3
- GCC版本:11.4.0
疑问背景
关于返回地址所属栈帧(调用者或被调用者)存在两种不同表述:
- 《Computer Systems: A Programmer's Perspective》(深入理解计算机系统)的图示显示返回地址位于调用者栈帧;
- 《System V Application Binary Interface AMD64 Architecture Processor Supplement》(System V AMD64架构ABI补充规范)的图示则显示其位于被调用者栈帧。
问题与解答
1. 哪种表述正确?
两种表述都成立,核心差异来自栈帧边界的定义角度:
- 《深入理解计算机系统》从调用者的执行流程出发,把
call指令压入的返回地址归为调用者栈帧——因为返回地址是调用者发起调用操作的产物,属于调用者上下文的一部分。 - System V AMD64 ABI则从被调用者的栈帧维护规则出发,将返回地址划入被调用者栈帧——因为被调用者执行
ret指令需要读取该地址,且通过leave指令维护栈帧时,会覆盖包含返回地址的栈空间范围,ABI规范的栈帧布局默认包含这部分内容。
在你所用的x86_64 Ubuntu环境(遵循System V AMD64 ABI)中,从实际代码执行和调试的角度,返回地址的管理是被调用者栈帧逻辑的一部分。
2. 返回地址的栈帧归属是否是未被ABI规范的无关细节?
这并非无关细节,只是ABI规范的是行为逻辑而非字面意义上的归属标签:
- System V AMD64 ABI明确规定了
call/ret指令的栈操作、栈布局结构,以及帧指针rbp的使用规则,返回地址的位置是这些规则的直接结果。不同资料的归属表述差异,只是对栈帧边界的划分角度不同。 - 对开发者来说,这种差异会影响调试分析(比如栈回溯的解析逻辑)和调用流程的理解,需要根据场景对应不同的划分方式。
内容的提问来源于stack exchange,提问作者alessio solari
相关产品推荐
相关产品推荐

