You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:11:05