9

「bl」またはリンク命令を含む分岐は、ほとんどの場合 0xebfffffe になります。

ただし、プロセッサと GNU binutils objdump は、どういうわけか分岐先を認識しています。

00000000 <init_module>:
   0:   e1a0c00d        mov     ip, sp
   4:   e92ddff0        push    {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc}
   8:   e24cb004        sub     fp, ip, #4
   c:   e24dd038        sub     sp, sp, #56     ; 0x38
  10:   ebfffffe        bl      0 <init_module>
  14:   e59f0640        ldr     r0, [pc, #1600] ; 65c <init_module+0x65c>
  18:   ebfffffe        bl      74 <init_module+0x74>

彼らはどのように知っていますか?

4

1 に答える 1

13

この問題は、最終的な実行可能ファイルや共有オブジェクトではなく、オブジェクト ファイルの逆アセンブリを見ていることが原因で発生します。

アセンブラがオブジェクト ファイルを生成するとき、blターゲットの最終アドレスはまだ固定されていません (リンクされる他のオブジェクト ファイルに依存します)。そのため、アセンブラはアドレスを 0 に設定しますがbl、最終ファイルのどこに移動するかをリンカに伝える再配置も追加します。objdump(スイッチを追加することで、再配置情報を確認できます-r。)

リンク時に、リンカは再配置を処理し、ターゲット関数の最終アドレスを計算し、ターゲット アドレスが整列するように命令をパッチします。リンクされた最終的な実行可能ファイルを逆アセンブルすると、別のオペコードが表示されます。

于 2013-02-21T14:14:54.033 に答える