2013-02-21 14 views
8

(BL)またはリンク付き分岐命令はほとんど常にある、しかし0xebfffffe'BL'アームの命令分解はどのように機能しますか?

となり、プロセッサおよび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> 

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

答えて

11

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

アセンブラがオブジェクトファイルを生成しているとき、blターゲットの最終アドレスはまだ固定されていません(リンク先のオブジェクトファイルによって異なります)。したがって、アセンブラはアドレスを0に設定しますが、最終的なファイルにこのblが入るはずの場所をリンカに伝える再配置も追加します。 objdumpには再配置情報が表示されます。

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

+0

ありがとう(spasibo)。ファイルはカーネルモジュールです。私はそれが最終的な、リンクされた実行可能ファイルだと思ったが、それは明らかにそうではない。 '-r'スイッチは私が探していたものです。 – yanychar

+1

部分的にリンクされています。インポートされたカーネルシンボルはロード時にカーネルローダによって解決されます。 –

関連する問題