2

32 ビットおよび 64 ビットの Linux OS 用のドライバーを作成しています。要件の 1 つは、すべてのコードがコールアウトなしで自己完結型である必要があることです。64 ビットでは問題はありませんが、32 ビット GCC では呼び出し命令が次のバイトに追加されるようです。少し検索した後、次のリンクを見つけました。

http://forum.soft32.com/linux/Strange-problem-disassembly-shared-lib-ftopict439936.html

32 ビット Linux でこれを無効にする方法はありますか?

例: 32 ビット逆アセンブル:

<testfunc>:
0: push %ebp
1: mov  %esp, %ebp
3: call 4 <test_func+0x4>
<...some operation on ebx as mentioned in the link above>

64 ビット分解:

<testfunc>:
    0: push %rbp
    1: mov  %rsp, %rbp
    3: <...no call here>

「testfunc」にはまったく呼び出しがありません。それでも、32 ビット コンパイラがこれらの「呼び出し」命令を追加するのはなぜですか? どんな助けでも大歓迎です。

4

2 に答える 2

4

32ビットの逆アセンブルで見られるのは、コードを位置に依存しないようにする方法かもしれません。+定数callに等しいリターンアドレスをスタックにプッシュすることを覚えていますか?eip64ビットモードでは、rip相対アドレス指定があります。32ビットにはありません。したがって、この呼び出しは、その命令ポインタ相対アドレス指定をシミュレートする場合があります。

于 2012-06-28T17:32:35.210 に答える
0

この次のバイトへの呼び出し命令は、「gprof」ツールの関数プロファイリングから来ています。コンパイルから「-pg」オプションを削除することで、これらの「call」命令を取り除くことができました。

これはドライバーであるため、Linux カーネル構成 (CONFIG_FUNCTION_TRACER) から取得されました。

于 2012-07-11T23:03:41.380 に答える