何时使用.arm.exidx



我正在使用MBXXX目标进行contiki 2.7。在构建我的代码时,链接器抱怨。在修补了链接脚本contiki-2.7/cpu/cpu/stm32w108/gnu-stm32w108.ld之后

__exidx_start = .;
__exidx_end = .;

with:

.ARM.exidx : {
    __exidx_start = .;
    *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    __exidx_end = .;
} >ROM_region

稍后,当我尝试通过使用objdump -h查看其他示例应用程序的标题列表时,我没有找到此特定的 .arm.exidx 部分,而我的应用程序中存在。谷歌搜索 .arm.Exidx 使我了解到它用于某些C 异常处理。既然我的代码是纯C代码,为什么我的代码中存在此部分?何时 .arm.Exidx 代码中存在什么?

是什么?


好吧,我没有任何这样的编译器选项。实际上,我正在使用AXTLS API,并将证书处理代码删除并将其移植到Contiki。在进一步的挖掘中,我在Bigint实施中发现了一种可恶的行为。简而

static bigint *bi_int_multiply(BI_CTX *ctx, bigint *bia, comp b)
{
   int j = 0, n = bia->size;
   bigint *biR = alloc(ctx, n + 1);
   comp carry = 5;
   comp *r = biR->comps;
   comp *a = bia->comps;
   check(bia);
   /* clear things to start with */
   memset(r, 0, ((n+1)*COMP_BYTE_SIZE));

   do
   {
       long_comp tmp = *r + (long_comp)a[j]*b + carry;
   //    *r++ = (comp)tmp;              /* downsize */
       carry = (comp)(tmp >> COMP_BIT_SIZE);
   } while (++j < n);
  // *r = carry;
  bi_free(ctx, bia);
  return trim(biR);
}

如果未注释的部分(R变量分配)是未注册的,则会出现 .arm.exidx 出现的东西,否则不会!现在可以解释吗?


我找不到在alloc()实现中使用的任何东西。代码的某些单独区域中使用了2个alloca()的参考文献,我将其替换为malloc()free(),但也没有解决问题。alloc()实施仅致电malloc()realloc()free()

.ARM.exidx是包含用于放松堆栈的信息的部分。如果您的C程序具有打印出堆栈回溯功能,则功能可能取决于此部分。

也许在编译器选项中查找-funwind-tables-fexceptions标志。

此功能在'c'中使用。ARM APCS仅使用框架指针来还原堆栈。较新的AAPC有时会使用表。使用这些机制使用这些机制。对于裸金属嵌入式设备,它可用于追踪堆栈。例如,Linux的Undind.c同时使用exidxextab部分进行堆栈跟踪。

简要介绍exidx是一个例程启动地址和extab表索引的排序表。通过exidx进行的二进制搜索将找到相应的extab条目。extab条目在此例程 Note1 中具有有关堆栈的详细信息。它提供了有关例程在堆栈上存储的内容的详细信息。

如果未注释的部分(R变量分配)没有按需,则出现.arm.Exidx的出现,否则不会!现在可以解释吗?

当您具有语句*r++ = (comp)tmp;时,编译器无法保存寄存器中的所有变量,并且需要使用堆栈(或至少fp)。这使其发射和exidxextab数据。


有一些解决方案。如果您不需要堆栈跟踪或异步功能,则可以丢弃exidxextab。使用-mapcs-frame使用GNU工具/GCC可以完成更简单的堆栈放松;然后,fp将始终用于存储以前的堆栈框架(存储其呼叫者fp等)。实际的表不大,放松的例程很简单。可能没有污染普通程序路径或使用诸如-mapcs-frame之类的寄存器的表格,也许是3%的开销。在带有缓存的Cortex-A CPU上所需的理想。

参考:ATPCS链接和帧指针解释了
手臂extab的结构

note1:这是在序言对堆栈进行调整之后。
Note2: ex适用于例外,但不仅适用于C 例外。

添加到Tangrs的响应中,如果您gcc -v,则可以转储编译过程中使用的默认选项。

GCC的所有选项(隐式&amp; emp; emp; emp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp;

cc1程序

最新更新