Quando o .ARM.exidx é usado

Estou trabalhando no Contiki 2.7 com o destino mbxxx. Ao criar meu código, o vinculador reclamou de umasobreposição das seções .ARM.exidx e .data. Depois de alguns ajustes no script do vinculador contiki-2.7 / cpu / stm32w108 / gnu-stm32w108.ld, corrigi o problema substituindo:

__exidx_start = .;
__exidx_end = .;

com:

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

Mais tarde, quando tentei ver a lista de cabeçalhos de alguns outros aplicativos de exemplo usando objdump -h, não encontrei essa seção .ARM.exidx específica, enquanto ela está presente no meu aplicativo. Pesquisando sobre .ARM.exidx me levou ao fato de que ele é usado para algum tratamento de exceção em c ++. Como meu código é um código C puro, por que esta seção está presente no meu código? Quando geralmente o .ARM.exidx está presente em um código e qual é a sua utilidade?

==================================================== ================================

Bem, não, eu não tenho essas opções de compilador. Na verdade, estou usando a API do AxTLS e rasgou o código de manipulação de certificados e o portou para o contiki. Em algumas escavações adicionais, encontrei um comportamento suspeito na implementação bigint. Para ser breve ... eis o corpo de uma função do arquivo 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);
}

se as partes comentadas (a atribuição da variável r) não forem comentadas, a coisa .ARM.exidx aparecerá, caso contrário, não aparecerá! Agora isso pode ser explicado ???

==================================================== ================================

Não encontrei nada fora do comum usado na implementação dealloc(). Houve 2 referências dealloca() usado em alguma região separada do código, que substitui pormalloc() efree(), mas isso também não resolveu o problema.alloc() implementação tem apenas chamadas paramalloc(),realloc() efree()

questionAnswers(2)

yourAnswerToTheQuestion