1

GNU ツール (gcc、binutils など) を使用して、アセンブリ命令のすべての出現をノーオペレーションに変更することは可能ですか? 具体的には、-pg オプションを指定した gcc は、次のアセンブリ (ARM) を生成します。

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: ebfffffe    bl  0 <mcount>

この最後の命令のアドレスを記録し、次のコードのように nop に変更したい

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: e1a00000    nop         (mov r0,r0)

Linux カーネルは実行時にこれと同様のことを行うことができますが、私はビルド時の解決策を探しています。

4

2 に答える 2

6

でコードをコンパイルgcc -Sして、オブジェクト ファイルまたは実行可能ファイルに完全にコンパイルする代わりに、アセンブラー リストを出力できます。次に、目的の命令をノーオペレーション (たとえば を使用sed) に置き換えて、そこからコンパイルを続行します。

元のソース コードがないオブジェクト ファイルまたはライブラリに対してもこれを実行する場合は、代わりにツールを使用して、objdump(1)それらを逆アセンブルし、置換する命令のアドレスを取得する必要があります。次に、オブジェクト ファイルのヘッダーを解析して、ファイル内のこれらの命令のオフセットを見つけ、オブジェクト ファイル内のマシン命令を no-op に直接置き換えます。これは少しトリッキーですが、実行可能です。

于 2009-04-25T01:18:54.840 に答える
4

これは、たとえば x86 よりも RISC 風の固定長命令フォーマットの方が確かに簡単です。

libelf (こちらの素敵なチュートリアル: http://people.freebsd.org/~jkoshy/download/libelf/article.html ) または libbfd ( http://sourceware.org/binutils/docs-2.19 ) を使用するのは比較的簡単です。 /bfd/index.html ) を使用してオブジェクト ファイルを開き、.text セクション内の命令を変更して、提供された API を使用して再度書き込みます。努力する価値があるかどうかは、非技術的な考慮事項に依存します (私は少し興味があります...)。

クロス開発環境で動作する必要がある場合、libelf または libbfd の使用にはいくつかの問題がある可能性があることに注意してください。

于 2009-04-25T00:49:18.813 に答える