9

__exidx_start = .;こんにちは、ラベルの値をロケーション カウンターの値に設定するコード " " を見つけたリンカ スクリプトがあります.。このラベルは、同じリンカー スクリプト内のどこにも使用されていません。

最初の行の数行下に同様のラベルが定義されており、同じように定義されています " __exidx_end = .;"。

これらの 2 つのラベルはセクション.text.rodataセクションの境界ですが、リンカー スクリプトで使用されていない場合、なぜこれら 2 つを定義するのかわかりません。

4

2 に答える 2

5

これらのシンボルは、例外処理フェーズ中に制御を取得する GCC の呼び出しチェーンの巻き戻しメカニズムによって内部的に使用されます。たとえば、 unwind-arm-common.inc:104には、例外処理テーブルの境界がこれらのシンボルへのポインターとして取得される例があります。

.ARM.exidx*シンボルが囲むエントリについては、例外処理インデックス テーブルを形成します。これは、C++ の ARM 例外処理 ABI (セクション 4.4.1) の一部です


更新 20.05.2020

@pixelou による質問への回答:
これらのセクションはデバッグとは関係ありませんが、例外巻き戻しメカニズムの基礎を形成します。セクションを削除すると、スタック上の無効な状態を正確に処理する代わりに、プログラムが (完全に失敗する)*.exidx*強制的に混乱をクリーンアップできなくなります。abortその巻き戻し情報がなければ、プログラムは-fno-exceptionsオプションで構築された場合のように動作します。

于 2019-08-04T19:35:10.800 に答える
2

これらはリンカー スクリプトでは使用されませんが、extern 変数として宣言され、gcc ライブラリで使用されます。それらを取り出すと、次のようになります。

.../gcc/config/arm/unwind-arm.c:614: `__exidx_start' への未定義の参照
.../gcc/config/arm/unwind-arm.c:614: `__exidx_end' への未定義の参照
于 2012-04-10T04:30:11.227 に答える