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

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

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

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

に保存すると、次のf.cコンパイルgcc -c f.c結果が表示されますf.oobjdump -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など)を使用できますか?

ベストアンサー1

次のコマンドを使用して、テキストセグメントのバイト値を抽出できます。

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

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

objcopyは、バイナリ出力ターゲット(-Oバイナリを使用するなど)を使用してネイティブバイナリを生成するために使用できます。 objcopyがネイティブバイナリファイルを生成すると、デフォルトでは入力オブジェクトファイルの内容のメモリダンプが生成されます。すべてのシンボルおよび再配置情報は削除されます。メモリダンプは、出力ファイルの最下部にコピーされたロードアドレスから始まります。

オプション-j .text:

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

最終結果は、foそのセクションのバイナリ値.text、つまりシンボルや再配置情報のない実行コードのみを含むファイル()です。

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

$ od -An -v -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

おすすめ記事