4

https://www.keil.com/support/man/docs/armlink/armlink_pge1406301797482.htmを読みました。しかし、アームリンカーが関数呼び出しの間に挿入するベニアが何であるかを理解できません。

「ARMアーキテクチャのプロシージャコール標準」ドキュメントでは、次のように述べています。

5.3.1.1 リンカによる IP の使用 ARM 状態および Thumb 状態の BL 命令はいずれも 32 ビット アドレス空間全体をアドレス指定できないため、リンカが呼び出しルーチンと呼び出されたルーチンの間にベニアを挿入する必要がある場合があります。サブルーチン。ベニアは、ARM-Thumb インターワーキングまたは動的リンクをサポートするためにも必要になる場合があります。挿入されたすべてのベニアは、IP (r12) と条件コード フラグを除くすべてのレジスタの内容を保持する必要があります。適合プログラムは、IP を変更するベニアが、インターワーキングまたは長い分岐をサポートする再配置にさらされる分岐命令に挿入される可能性があると想定する必要があります。注 R_ARM_CALL、R_ARM_JUMP24、R_ARM_PC24、R_ARM_THM_CALL、R_ARM_THM_JUMP24、R_ARM_THM_JUMP19 は、このプロパティを持つ ELF 再配置タイプの例です。詳細については、[AAELF] を参照してください。

これは私が推測するものです、それはこのようなものですか?: 関数 A が関数 B を呼び出し、これらの 2 つの関数が離れすぎてblコマンドが表現できない場合、リンカーは関数 A と B の間に関数 C を挿入し、関数 C が関数 B に近づくようにします。関数 A はb命令を使用します。関数Cに移動し(関数呼び出し間ですべてのレジスタをコピーします)、関数Cはbl命令を使用します(すべてのレジスタもコピーします)。もちろん、r12 レジスタは、残りのロング ジャンプ アドレス ビットを保持するために使用されます。これはベニヤの意味ですか?(アームがベニアとは何かを説明せず、ベニアが提供するものだけを説明する理由がわかりません..)

4

2 に答える 2