Tal*_*ath 6 c++ arm keil armcc
我试图准确理解异常表 ( .arm.extab) 的工作原理。我知道这是依赖于编译器的,所以我将限制自己使用armcc(因为我使用的是Keil)。
表中的典型条目类似于:
b0aa0380 2a002c00 01000000 00000000
据我了解,第一个字编码个性例程的指令,而第三个字是重R_ARM_PREL31定位到 catch 块的开头。
让我困惑的是第二个词——它似乎被分成了两条短裤,其中第二条距离投掷功能开始处有一段距离,但我不确定到底是什么(也不确定第一条短裤的作用)。
是否有任何地方记录了这些条目的结构?
我找到了 2 个相关文档,但据我所知,它们没有依赖于编译器的信息,因此它们还不够:
如果您碰巧错过了字节顺序,则适用以下内容。即使原始示例中的字节顺序正确,某些信息也可能有用。
\nextab和exidx是 AAPCS 添加的部分,AAPCS 是较新的 ARM ABI。
对于较旧的 APCS,帧指针 或fp是活动例程链接回主例程的根(或_start)。使用 AAPCS 创建记录并将其放置在exidx和extab部分中。fp当用作通用寄存器时,需要这些来展开堆栈(和资源) 。
这exidx是例程起始地址和索引的有序表extab(或无法展开)。PC可以检查并通过表格搜索(程序计数器)以找到相应的extab条目。
ARM EHABI文档有第 7 节关于异常处理表条目。这些是extab条目,您至少可以从那里开始了解更多信息。有两个定义,
紧凑模型将用于大多数“C”代码。与 C++ 一样,堆栈上没有要销毁的对象。十六进制8003aab0给出,
1000b 表示前导半字节,因此这是紧凑的。0000b 为索引。Su16\xe2\x80\x94短03h - 弹出 16 个字节,一些局部变量或填充。aah - 弹出 r4-r6b0h——完成表 4,ARM 定义的帧展开指令给出了每个字节的展开数据。
\n下一个是对一般0x002c002a个性惯例的抵消。接下来的四个值应该是8.2 数据结构,它们是一个大小并且应该为零...接下来是步幅,然后是四字节对象类型信息。偏移量 0x2c002a 将调用对象析构函数或某种包装器来执行此操作。
我认为所有 C++ 代码都旨在使用此通用方法。其他方法适用于不同的语言,而不是编译器。
\n相关问答及链接:
\n.cantunwind、.vsave等。| 归档时间: |
|
| 查看次数: |
3995 次 |
| 最近记录: |