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

时间:2019-08-11 15:17:59

标签: c++ arm keil armcc

我试图确切地了解异常表(.arm.extab)的工作方式。 我知道这取决于编译器,因此我将自己限制为armcc(因为我使用的是Keil)。

表中的典型条目如下所示: 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

1 个答案:

答案 0 :(得分:0)

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


extabexidx是AAPCS(较新的ARM ABI)添加的部分。

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

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

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

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

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

  • 1000 b代表前半字节,所以这很紧凑。
  • 0000 b作为索引。 Su16-简短
  • 03 h-弹出16个字节,有些是本地字符或填充。
  • aa h-弹出r4-r6
  • b0 h-完成

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

下一个是0x002c002a,它是通用人格常规的偏移量。接下来的四个值应为 8.2数据结构,其大小为零,然后为零...接下来是跨步,然后是四个字节的对象类型信息。偏移量0x2c002a可以调用对象析构函数或某种包装器来实现。


我认为所有C ++代码都打算使用此 Generic 方法。其他方法适用于不同的语言和 NOT 编译器。

相关的问与答和链接: