【问题标题】:What's the structure of .arm.extab entry in armcc?armcc中.arm.extab条目的结构是什么?
【发布时间】:2019-12-18 10:39:29
【问题描述】:

我试图准确了解异常表 (.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

【问题讨论】:

  • 您确定字节顺序正确吗?即,第一个值是0xb0aa0380 而不是litte-endian 0x8003aab0?
  • 我发现 g++ 和 clang 都使用 'generic' 方法。例如 _Unwind_Control_Block.exception_class 是“GNUCC++\0”、“CLNGC++\0”或“ARM\0C++\0”。 clang, gcc 这允许可操作性。 libgcc/libsupc++ 有改变异常方法的配置,但它默认为 ehabi 文档中的那个。我不明白为什么 keil 会做其他事情,但这是可能的。

标签: c++ arm keil armcc


【解决方案1】:

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


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 给出,

  • 1000b 表示领先的半字节,所以这是紧凑的。
  • 0000b 用于索引。 Su16—短
  • 03h - 弹出 16 个字节,一些本地或填充。
  • aah - 弹出 r4-r6
  • b0h - 完成

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

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


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

相关问答和链接:

【讨论】:

    猜你喜欢
    • 2010-12-21
    • 2016-03-19
    • 2012-01-26
    • 2020-08-21
    • 1970-01-01
    • 2011-02-12
    • 2012-12-18
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多