x86_64 调用约定和堆栈帧

2024-01-10

我试图理解 GCC (4.4.3) 为 Ubuntu Linux 下运行的 x86_64 机器生成的可执行代码。特别是,我不明白代码如何跟踪堆栈帧。过去,在 32 位代码中,我习惯于在几乎每个函数中看到这个“序言”:

push %ebp
movl %esp, %ebp

然后,在函数结束时,会出现一个“尾声”,或者

sub $xx, %esp   # Where xx is a number based on GCC's accounting.
pop %ebp
ret

或者简单地

leave
ret

它完成同样的事情:

  • 将堆栈指针设置为当前帧的顶部,就在 退货地址
  • 恢复旧的帧指针值。

在 64 位代码中,正如我通过 objdump 反汇编看到的那样,许多函数不遵循此约定 - 它们不会推送 %rbp,然后将 %rsp 保存到 %rbp,像 GDB 这样的调试器如何构建回溯?

我的真正目标是尝试找出一个合理的地址,当执行到达程序中任意函数的开头时(堆栈指针可能已向下移动),将其视为用户堆栈的顶部(最高地址)。例如,对于“顶部”,argv 的原始地址是理想的,但我无法从 main 调用的任意函数访问它。我一开始以为我可以使用旧的回溯方法:追逐保存的帧指针值,直到保存的值为0——然后,之后的下一个可以算作最高的实用值。 (这与获取 argv 的地址不同,但它可以找到 _start 处的堆栈指针值或 _start 调用的任何内容 [例如 __libc_start_main]。)现在,我不知道如何获取 64 位代码中的等效地址。

Thanks.


我认为区别在于 amd64 中更鼓励省略帧指针。第 16 页的脚注abi https://refspecs.linuxbase.org/elf/x86-64-abi-0.99.pdf#17 says

可以通过使用来避免传统使用 %rbp 作为堆栈帧的帧指针 %rsp(堆栈指针)来索引堆栈帧。该技术在序言和尾声中保存了两条指令,并提供了一个额外的通用寄存器 (%rbp)。

我不知道GDB是做什么的。我假设当编译时-g,对象具有神奇的调试信息,允许 GDB 重建它需要的内容。我认为我没有在没有调试信息的情况下在 64 位机器上尝试过 GDB。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

x86_64 调用约定和堆栈帧 的相关文章

  • 为什么模板类的静态成员不唯一

    看一下下面的代码 include
  • 如何将动态数据写入 MVC 3 Razor 中的页面布局?

    我有带有 Razor 引擎的 MVC 3 C 项目 将动态数据写入 Layout cshtml 的方法和最佳实践是什么 例如 也许我想在网站的右上角显示用户名 该名称来自会话 数据库或基于用户登录的任何内容 更新 我也在寻找将某些数据渲染到
  • 从 unsigned char* 到 char* 的转换无效

    这是一个代码 1 int main int argc char argv 2 3 signed char S psc 4 unsigned char U pusc 5 char C pc 6 7 C S 8 C U 9 10 pc psc
  • 如何从命名空间内重载运算符<<

    这是我能想到的最小的包含示例 首先是类的标题 每当使用 pragma once ifndef EURO H define EURO H include
  • 如何按名字和姓氏排序,然后按 SamAccountName 排序,其中并非所有姓名都有名字和姓氏?

    目前 我有以下内容 来自 LDAP Get context based on currently logged on user PrincipalContext domainContext new PrincipalContext Cont
  • 是否可以在对Where 的调用中调用命名方法?

    我试图从 RedGate 的这本免费电子书中了解 Linq 的一些性能影响ftp support red gate com ebooks under the hood of net memory management part1 pdf f
  • 使用 ClosedXML 附加到 excel 文件

    我需要将新数据附加到使用 ClosedXML 创建的现有 Excel 文件中 如何使用 ClosedXML 附加到 Excel 文件 如何获取最后一条记录的行号并将其附加到该行号上 或者还有其他内容 Thanks 打开现有工作簿 然后使用L
  • 指向 VLA 的指针

    你可能知道 VLA 的优点和缺点 https stackoverflow com a 3082302 1606345在 C11 中它们是可选的 我认为使 VLA 成为可选的主要原因是 堆栈可能会爆炸 int arr n where n 10
  • Bazel:将编译标志添加到默认 C++ 工具链

    我想向默认的 C 工具链添加一些编译器和链接器标志 以便我构建的所有目标 本地或导入 共享它们 我知道可以定义我自己的工具链 但我不想这样做 因为它非常复杂且容易出错 理想情况下我想要这样的东西 cc toolchain cc defaul
  • VS C# 中的依赖地狱,找不到依赖项

    我创建了一个图表 C 库 我们称之为chartlibrary 它本身依赖于多个第三方 dll 文件 在另一个可执行项目中 我们称之为chartuser 我参考了chartlibrary项目 两个项目位于 Visual Studio 中的同一
  • 我应该使用 Helgrind 还是 DRD 进行线程错误检测?

    好像Valgrind http valgrind org docs manual manual html有两个工具都可以进行线程错误检测 Helgrind http valgrind org docs manual hg manual ht
  • 来自用户定义文字的整数字符序列,以字符串作为参数

    目前 只有双精度数可以在用户定义的文字中生成字符模板 template
  • 没有 FPU 的处理器中的浮点计算

    是否可以在没有浮点单元的嵌入式处理器中执行浮点运算 是的 您只需要在软件中完成即可 你的编译器可能会提供支持 http gcc gnu org onlinedocs gccint Soft float library routines ht
  • 如何使用 MongoDB 实现 ASP.NET Core 3.1 Identity?

    是一个 API 用于简化后端和逻辑代码来管理用户 密码 个人资料数据 角色 声明 令牌 电子邮件确认等 对于 Visual Studio 来说 支撑脚手架 https learn microsoft com en us aspnet cor
  • OpenSSL:无需 SSL_read() / SSL_write() 即可执行加密/解密

    我已经用 C 语言编写了一个基于事件的网络库 现在我想通过 OpenSSL 添加 SSL TLS 支持 而不是使用SSL read and SSL write 我宁愿让 OpenSSL 只执行传出 传入数据的加密 解密 让我自己传输 接收数
  • 提升shared_from_this<>()

    有人可以用几句话概括一下如何提升shared from this lt gt 应该使用智能指针 特别是从使用绑定函数在 io service 中注册处理程序的角度来看 编辑 一些回复要求提供更多背景信息 基本上 我正在寻找 陷阱 即人们使用
  • 为什么 getch 不可移植?

    是什么使得 getch 本质上无法作为标准 C 函数包含在内 对于控制台界面来说 它是如此直观和优雅 如果没有它 要求输入单个字符总是会产生误导 因为用户可以输入多个键 更糟糕的是 您经常需要确保在读取控制台输入后清除标准输入 这甚至不是作
  • 查找文本文件中每行的行大小

    如何计算每行中的字符或数字数量 是否有类似 EOF 的东西更像是行尾 您可以遍历行中的每个字符并不断增加计数器直到行尾 n 遇到 确保以文本模式打开文件 r 而不是二进制模式 rb 否则流不会自动将不同平台的行结束序列转换为 n 人物 这是
  • 使用 List.Contains 方法为 LINQ 构建表达式树

    Problem 我正在重构一些LINQ查询我们的 Web 应用程序中的多个报告 并且我尝试将一些重复的查询谓词移至它们自己的中IQueryable扩展方法 以便我们可以将它们重新用于这些报告以及将来的报告 正如您可能推断的那样 我已经重构了
  • 从最大到最小的3个整数

    我是 C 初学者 我使用 编程 使用 C 的原理与实践 第二版 问题如下 编写一个程序 提示用户输入三个整数值 然后以逗号分隔的数字顺序输出这些值 如果两个值相同 则应将它们排列在一起 include

随机推荐

  • 保留源 shell 脚本而不退出终端

    我正在编写一个 shell 脚本来保存一些击键并避免拼写错误 我想将脚本保留为单个文件 该文件调用内部方法 函数并在出现问题时终止函数without离开航站楼 my script sh bin bash exit if no git if
  • 为什么方法定义返回符号?

    当你定义一个方法时 它会返回一个与该方法同名的符号 这有道理吗 或者它只是作为您创建它的验证 Like so def something end gt something IRb always显示调用结果inspect计算的最后一个表达式的
  • StringBuilder容量()

    我注意到capacity方法返回StringBuilder没有逻辑的能力 方式 有时它的值等于字符串长度 有时它更大 有没有一个方程式可以知道它的逻辑是什么 我将尝试用一些例子来解释这一点 public class StringBuilde
  • 编译错误:“stddef.h:没有这样的文件或目录”

    每当我尝试编译此代码时 总是会出现以下错误 In file included from usr include wchar h 6 0 from usr lib gcc i686 pc cygwin 4 9 2 include c cwch
  • 在 Inno Setup 中将字符串编码为 Base64(Inno Setup 的 Unicode 版本)

    Problem 我尝试使用帕斯卡函数EncodeStringBase64 假设 Inno Setup 可以访问 Pascal 标准库 但它无法找到它并提供一个Unknown Identifier error https www freepa
  • 使用 GDI+ 将修改后的图像保存到原始文件

    我正在从文件加载位图图像 当我尝试将图像保存到另一个文件时 出现以下错误 GDI 中发生一般错误 我相信这是因为文件被图像对象锁定 好的 所以尝试调用 Image Clone 函数 这仍然锁定文件 唔 接下来 我尝试从 FileStream
  • 删除目录下的所有文件

    我需要使用 Qt 删除目录中的所有文件 该目录中的所有文件都将具有扩展名 txt 我不想删除目录本身 有谁知道我该怎么做 我看过 QDir 但没有运气 比约恩斯的答案被调整为不会永远循环 QString path whatever QDir
  • 版本 4.0.0 文档中的示例中的 Identity Server 范围无效

    我正在使用 IdentityServer4 遵循以下文档https identityserver4 readthedocs io en latest quickstarts 1 client credentials html https i
  • OWL RDF/TTL 根据属性创建类的实例成员

    我正在尝试设计一个本体 该本体将根据产品组件对产品进行分类 在下面的例子中我有一堂课Ingredient有一个实例eggs 我想添加apple tart不包含的所有类别的产品eggs 所以在这种情况下apple tart将被添加到班级中Gl
  • 限制 UITextView 中的行数

    我很清楚有人问过这个问题 但我找不到有效的答案 使用先前解决方案的组合 我想出了以下代码 BOOL textView UITextView textView shouldChangeTextInRange NSRange range rep
  • Google App Engine 上的 CloudSQL PDO(unix_socket) 问题

    我正在尝试从 App Engine 连接到我的 CloudSQL 实例 我的设置方法是使用静态 IP 我可以使用它从 App Engine 外部 即在我的开发环境中 连接到它 但是 当应用程序在 GAE 中运行时 连接到数据库的唯一方法是使
  • 如何在 Matplotlib 中使用带有形状内文本的自定义标记?

    背景 在 Matplotlib 中 我们可以使用 mathtext 作为标记来渲染字符串 参考文献1 https matplotlib org 3 2 1 api markers api html Question 有什么方法可以将此文本封
  • UP3(jawbone)如何实时检索睡眠值

    我正在尝试实时检索我的睡眠数据 我无法从文档中找到如何实现它 UP平台Android SDK https github com Jawbone UPPlatform Android SDK 附 我愿意进行睡眠实验 需要在我到达时获取一个事件
  • Java EE / J2EE 与 J2SE / JDK 版本之间的关联

    我确信我会找到重复的问题或令人满意的答案 但我没有 我正在寻找的是这些问题的答案 Java EE J2EE 和 J2SE JDK 版本之间是否有官方关联 如果答案是肯定的 那么它写在哪里 如果答案是否定的 那为什么呢 是否有非官方版本表 例
  • Javascript原生排序方法代码

    知道如何查看本机 javascript 方法的实现 特别是排序 方法 我之所以寻找这个 我只是想知道所使用的算法是什么以及其复杂性是什么 我正在 javascript 中对一个巨大的 json 对象进行排序 我想知道我是否应该为此编写自己的
  • 有没有办法让 JSF 与通用 setter 和 getter 一起使用

    有没有办法让 JSF 与通用实体一起工作 如下所述 属性 java public interface MyProperty
  • 如何将我的所有函数打包在批处理文件中作为单独的文件?

    我的问题与this https stackoverflow com questions 10149194 something like a function method in batch files问题 我有几个需要从批处理文件执行的操作
  • 如何转换pandas中日期时间列的时区,然后删除时区?

    我有一个列 非索引列 其中包含日期时间 例如 前五个条目如下所示 Timestamp 2018 11 15 19 57 55 Timestamp 2018 11 15 19 59 46 Timestamp 2018 11 15 20 00
  • 如何将(声明)安全令牌传递给启用 WIF 的 WCF 服务

    我很想知道我们如何从已通过 WIF 启用的 WCF 服务身份验证的 WIF 应用程序发送安全令牌 任何帮助将不胜感激 答案并不简单 但以下步骤构成了 推荐模式 并记录在以下 MSDN 文章中 AD FS 2 0 身份委派分步指南 http
  • x86_64 调用约定和堆栈帧

    我试图理解 GCC 4 4 3 为 Ubuntu Linux 下运行的 x86 64 机器生成的可执行代码 特别是 我不明白代码如何跟踪堆栈帧 过去 在 32 位代码中 我习惯于在几乎每个函数中看到这个 序言 push ebp movl e