たとえば、次の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など)を使用できますか?
ベストアンサー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