我正在使用Contiki 2.7版本,使用mbxxx目标进行开发。在构建代码时,链接器报告了.ARM.exidx和.data节的重叠问题。经过对链接器脚本contiki-2.7/cpu/stm32w108/gnu-stm32w108.ld的一些修改后,我用以下代码解决了这个问题:
__exidx_start = .;
__exidx_end = .;
使用:
.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实现中的可疑行为。简而言之……这是bigint.c文件中一个函数的主体:
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()
。
biR
是否使用alloca()
或者alloc()
是如何实现的?编译器可能会使用相同的 C++ 机制来跟踪alloca()
类型的分配。当您注释掉r
并启用优化时,alloc()
将不会发生。 - artless noisealloc()
的实现中没有发现任何不寻常的用法。代码的某个独立区域中使用了2个alloca()
引用,但是我将它们替换为malloc()
和free()
也并没有解决问题。alloc()
的实现只调用了malloc()
、realloc()
和free()
。 - user2668988