gpt4 book ai didi

c++ - armcc中.arm.extab条目的结构是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:38:13 25 4
gpt4 key购买 nike

我试图准确理解异常表 (.arm.extab) 的工作原理。我知道这取决于编译器,所以我会限制自己使用 armcc(因为我使用的是 Keil)。

表中的典型条目类似于:b0aa0380 2a002c00 01000000 00000000

据我所知,第一个词编码了个性例程的指令,而第三个词是 R_ARM_PREL31 重定位到 catch block 的开头。

让我感到困惑的是第二个词——它似乎被分成了 2 个短裤,第二个短裤测量了距离 throw 功能开始的一段距离,但我不确定到底是什么(也不知道第一个短裤是什么确实)。

是否有任何地方记录了这些条目的结构?

我找到了 2 个相关文档,但据我所知,它们没有编译器相关的信息,因此它们还不够:

最佳答案

如果您碰巧错过了字节顺序,则适用以下内容。即使原始示例中的字节顺序正确,某些信息也可能有用。


extabexidx 是由 AAPCS 添加的部分,它是较新的 ARM ABI。

对于较旧的 APCS,帧指针或 fp 是事件例程返回主例程(或 _start)的链接的根。使用 AAPCS 记录被创建并放置在 exidxextab 部分。当 fp 用作通用寄存器时,需要这些来展开堆栈(和资源)。

exidx 是例程起始地址和 extab 索引(或不能展开)的有序表。 PC(程序计数器)可以通过表进行检查和搜索以找到相应的 extab 条目。

ARM EHABI文档的第 7 节是关于异常处理表条目的。这些是 extab 条目,您至少可以从那里开始了解更多信息。有两个定义,

  1. 泛型(或 C++)
  2. ARM 紧凑型

紧凑 模型将用于大多数“C”代码。与 C++ 一样,堆栈上没有要销毁的对象。十六进制 8003aab0 给出,

  • 1000前导半字节,所以这是紧凑的。
  • 0000b 为索引。 Su16—短
  • 03h - 弹出 16 个字节,一些局部变量或填充。
  • aah - 弹出 r4-r6
  • b0h - 完成

表4,ARM定义的帧展开指令给出了每个字节的展开数据。

下一个是 0x002c002a,它是 generic 个性例程的偏移量。接下来的四个值应该是 8.2 数据结构,它们是一个大小并且应该为零...接下来是跨度,然后是一个四字节的对象类型信息。偏移量 0x2c002a 将调用对象析构函数或某种包装器来执行此操作。


我认为所有 C++ 代码都旨在使用此通用 方法。其他方法适用于不同的语言和不是编译器。

相关问答和链接:

关于c++ - armcc中.arm.extab条目的结构是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57451208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com