私は mbxxx ターゲットで Contiki 2.7 に取り組んでいます。私のコードをビルドしている間、リンカは .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()