たとえば、次の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など)を使用できますか?
テキストセグメントのバイト値を抽出するには、次のようにします。
$ 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
いかがですか
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