web-dev-qa-db-ja.com

objdumpから16進のみの出力を取得する

たとえば、次のC関数があるとします。

void f(int *x, int *y)
{
    (*x) = (*x) * (*y);
}

f.cに保存すると、gcc -c f.cでコンパイルするとf.oが生成されます。 objdump -d f.oはこれを提供します:

f.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <f>:
   0:   55                      Push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 89 7d f8             mov    %rdi,-0x8(%rbp)
   8:   48 89 75 f0             mov    %rsi,-0x10(%rbp)
   c:   48 8b 45 f8             mov    -0x8(%rbp),%rax
  10:   8b 10                   mov    (%rax),%edx
  12:   48 8b 45 f0             mov    -0x10(%rbp),%rax
  16:   8b 00                   mov    (%rax),%eax
  18:   0f af d0                imul   %eax,%edx
  1b:   48 8b 45 f8             mov    -0x8(%rbp),%rax
  1f:   89 10                   mov    %edx,(%rax)
  21:   5d                      pop    %rbp
  22:   c3                      retq  

私はそれを次のようなものを出力したいと思います:

55 48 89 e5 48 89 7d f8 48 89 75 f0 48 8b 45 f8 8b 10 48 8b 45 f0 8b 00 0f af d0 48 8b 45 f8 89 10 5d c3

つまり、関数の16進値のみです。これを行うためのobjdumpフラグはありますか?それ以外の場合、この望ましい出力を得るためにどのツール(たとえば、awk、sed、cutなど)を使用できますか?

4
MD XF

テキストセグメントのバイト値を抽出するには、次のようにします。

$ objcopy -O binary -j .text f.o fo

-Oバイナリオプション:

objcopyを使用すると、バイナリの出力ターゲットを使用して生のバイナリファイルを生成できます(たとえば、-Oバイナリを使用します)。 objcopyがrawバイナリファイルを生成すると、基本的に、入力オブジェクトファイルの内容のメモリダンプが生成されます。すべてのシンボルと再配置情報は破棄されます。メモリダンプは、出力ファイルにコピーされた最も低いセクションのロードアドレスから始まります。

-j .textオプション:

-jセクションパターン
-only-section = sectionpattern
指定されたセクションのみを入力ファイルから出力ファイルにコピーします。このオプションは複数回指定できます。
このオプションを不適切に使用すると、出力ファイルが使用できなくなる場合があります。ワイルドカード文字はセクションパターンで使用できます。

最終結果は、foであり、.textセクションは、シンボルや再配置情報を含まない実行可能コードです。

次に、foファイルの16進値を出力します。

$ od -An -t x1 fo
 55 48 89 e5 48 89 7d f8 48 89 75 f0 48 8b 45 f8
 8b 10 48 8b 45 f0 8b 00 0f af d0 48 8b 45 f8 89
 10 90 5d c3
8
Isaac

いかがですか

awk '/^....:/{a=substr($0,9,20);sub(/ +$/,"",a);b=b" "a}END{print substr(b,2)}'

この場合、戻ります

55 48 89 e5 48 89 7d f8 48 89 75 f0 48 8b 45 f8 8b 10 48 8b 45 f0 8b 00 0f af d0 48 8b 45 f8 89 10 5d c3
2
steve