我试图确切地了解异常表(.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
答案 0 :(得分:0)
如果碰巧错过了字节顺序,则适用以下内容。即使原始示例中的字节顺序正确,某些信息也可能有用。
extab
和exidx
是AAPCS(较新的ARM ABI)添加的部分。
对于较旧的APCS,帧指针或fp
是活动例程返回主例程(或_start)的链接的根。使用AAPCS可以创建记录并将其放置在exidx
和extab
部分中。当fp
用作通用寄存器时,需要使用这些来释放堆栈(和资源)。
exidx
是例程起始地址和extab
索引(或无法展开)的有序表。可以检查PC
(程序计数器)并通过表格进行搜索以找到相应的extab
条目。
ARM EHABI文档的第6节是异常处理表条目。这些是extab
条目,您至少可以从那里开始以了解更多信息。有两个定义,
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 编译器。
相关的问与答和链接:
.cantunwind
,.vsave
等