armcc中.arm.extab条目的结构是什么?
What's the structure of .arm.extab entry in armcc?
我试图准确理解异常 table (.arm.extab) 是如何工作的。
我知道这取决于编译器,所以我会限制自己使用 armcc(因为我使用的是 Keil)。
table 中的典型条目如下所示:
b0aa0380 2a002c00 01000000 00000000
根据我的理解,第一个词编码个性例程的指令,而第三个词是 R_ARM_PREL31 重定位到 catch 块的开头。
让我感到困惑的是第二个词 - 它似乎被分成了 2 个短裤,其中第二个短裤距离投掷功能的开始有一段距离,但我不确定到底是什么(也不是什么第一个短片)。
是否有任何地方记录了这些条目的结构?
我找到了 2 个相关文档,但据我所知,它们没有编译器相关的信息,因此它们还不够:
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044f/IHI0044F_aaelf.pdf
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038b/IHI0038B_ehabi.pdf
如果您碰巧错过了字节顺序,则适用以下内容。即使原始示例中的字节顺序正确,某些信息也可能有用。
extab
和 exidx
是 AAPCS 添加的部分,它是较新的 ARM ABI。
对于较旧的 APCS,帧指针或 fp
是活动例程与主例程(或 _start)的链接的根。使用 AAPCS 记录被创建并放置在 exidx
和 extab
部分。当 fp
用作通用寄存器时,需要这些来展开堆栈(和资源)。
exidx
是一个有序的 table 例程起始地址和一个 extab
索引(或不能展开)。可以通过 table 检查和搜索 PC
(程序计数器)以找到相应的 extab
条目。
ARM EHABI 文档的第 6 节是关于 异常处理 Table 条目 。这些是 extab
个条目,您至少可以从那里开始了解更多信息。定义了两个,
- 泛型(或 C++)
- ARM 紧凑型
紧凑 模型将用于大多数 'C' 代码。与 C++ 一样,堆栈上没有要销毁的对象。十六进制 8003aab0
给出
1000
b 为前半字节,所以这是紧凑的。
0000
b 为索引。 Su16—短
03
h - 弹出 16 个字节,一些本地或填充。
aa
h - 弹出 r4-r6
b0
h - 完成
Table 4、ARM定义的帧展开指令给出每个字节的展开数据
下一个是 0x002c002a
,它是对 generic 个性例程的偏移。接下来的四个值应该是 8.2 数据结构 ,它们是一个大小并且应该为零...接下来是步幅,然后是一个四字节的对象类型信息。偏移量 0x2c002a 将调用对象析构函数或某种包装器来执行此操作。
我认为所有 C++ 代码都旨在使用这种 Generic 方法。其他方法适用于不同的语言和 NOT 编译器。
相关 Q/A 和链接:
- Arm exidx - 关于 exidx。
- ARM link and frame pointer - 旧 APCS 和许多 AAPCS 功能的情况。
- Linux ARM Unwind - 'C'.
的示例展开代码
- prel31 - 所以 Q/A 在上面的 Linux 代码中的 prel31 上。
- Generating unwind in ARM gnu assembler
- gas ARM directives参见:
.cantunwind
、.vsave
等
我试图准确理解异常 table (.arm.extab) 是如何工作的。 我知道这取决于编译器,所以我会限制自己使用 armcc(因为我使用的是 Keil)。
table 中的典型条目如下所示: b0aa0380 2a002c00 01000000 00000000
根据我的理解,第一个词编码个性例程的指令,而第三个词是 R_ARM_PREL31 重定位到 catch 块的开头。
让我感到困惑的是第二个词 - 它似乎被分成了 2 个短裤,其中第二个短裤距离投掷功能的开始有一段距离,但我不确定到底是什么(也不是什么第一个短片)。
是否有任何地方记录了这些条目的结构?
我找到了 2 个相关文档,但据我所知,它们没有编译器相关的信息,因此它们还不够: http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044f/IHI0044F_aaelf.pdf http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038b/IHI0038B_ehabi.pdf
如果您碰巧错过了字节顺序,则适用以下内容。即使原始示例中的字节顺序正确,某些信息也可能有用。
extab
和 exidx
是 AAPCS 添加的部分,它是较新的 ARM ABI。
对于较旧的 APCS,帧指针或 fp
是活动例程与主例程(或 _start)的链接的根。使用 AAPCS 记录被创建并放置在 exidx
和 extab
部分。当 fp
用作通用寄存器时,需要这些来展开堆栈(和资源)。
exidx
是一个有序的 table 例程起始地址和一个 extab
索引(或不能展开)。可以通过 table 检查和搜索 PC
(程序计数器)以找到相应的 extab
条目。
ARM EHABI 文档的第 6 节是关于 异常处理 Table 条目 。这些是 extab
个条目,您至少可以从那里开始了解更多信息。定义了两个,
- 泛型(或 C++)
- ARM 紧凑型
紧凑 模型将用于大多数 'C' 代码。与 C++ 一样,堆栈上没有要销毁的对象。十六进制 8003aab0
给出
1000
b 为前半字节,所以这是紧凑的。0000
b 为索引。 Su16—短03
h - 弹出 16 个字节,一些本地或填充。aa
h - 弹出 r4-r6b0
h - 完成
Table 4、ARM定义的帧展开指令给出每个字节的展开数据
下一个是 0x002c002a
,它是对 generic 个性例程的偏移。接下来的四个值应该是 8.2 数据结构 ,它们是一个大小并且应该为零...接下来是步幅,然后是一个四字节的对象类型信息。偏移量 0x2c002a 将调用对象析构函数或某种包装器来执行此操作。
我认为所有 C++ 代码都旨在使用这种 Generic 方法。其他方法适用于不同的语言和 NOT 编译器。
相关 Q/A 和链接:
- Arm exidx - 关于 exidx。
- ARM link and frame pointer - 旧 APCS 和许多 AAPCS 功能的情况。
- Linux ARM Unwind - 'C'. 的示例展开代码
- prel31 - 所以 Q/A 在上面的 Linux 代码中的 prel31 上。
- Generating unwind in ARM gnu assembler
- gas ARM directives参见:
.cantunwind
、.vsave
等