objcopy
を使用できます .o ファイルまたは a.out ファイルからテキスト セグメントを引き出します。
$ cat q.c
f() {}
$ cc -S -O q.c
$ cat q.s
.file "q.c"
.text
.globl f
.type f, @function
f:
pushl %ebp
movl %esp, %ebp
popl %ebp
ret
.size f, .-f
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits
$ cc -c -O q.c
$ objcopy -O binary q.o q.bin
$ od -X q.bin
0000000 5de58955 000000c3
0000005
$ objdump -d q.o
q.o: file format elf32-i386
Disassembly of section .text:
00000000 <f>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 5d pop %ebp
4: c3 ret
-Wl,<linker option>
でリンカーにオプションを直接渡すことができます
関連するドキュメントは、man gcc
から以下にコピーされます
-Wl,オプション
オプションをオプションとしてリンカーに渡します。オプションにコンマが含まれている場合、コンマで複数のオプションに分割されます。この構文を使用して、オプションに引数を渡すことができます。たとえば、-Wl,-Map,output.map は -Map output.map をリンカーに渡します。 GNU リンカーを使用する場合、-Wl,-Map=output.map を使用しても同じ効果が得られます。
-Wl,--oformat=binary
を渡すと gcc でコンパイルするとき elf 形式の代わりにバイナリ ファイルを生成します。どこ --oformat=binary
ld
に伝えます バイナリ ファイルを生成します。
これにより、objcopy
の必要がなくなります
--oformat=binary
に注意してください OUTPUT_FORMAT("binary")
と表現できます リンカー スクリプト内から。フラット バイナリを処理する場合は、リンカー スクリプトが提供する高レベルの制御から恩恵を受ける可能性が高くなります。
これを試してください:
$ gcc -c test.c
$ objcopy -O binary -j .text test.o binfile
objdump
で正しいことを確認できます :
$ objdump -d test.o
test.o: file format pe-i386
Disassembly of section .text:
00000000 <_f>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 04 sub $0x4,%esp
6: 8b 45 08 mov 0x8(%ebp),%eax
9: 0f af 45 08 imul 0x8(%ebp),%eax
d: 89 45 fc mov %eax,-0x4(%ebp)
10: 8b 45 fc mov -0x4(%ebp),%eax
13: 83 c0 02 add $0x2,%eax
16: c9 leave
17: c3 ret
そしてそれをバイナリファイルと比較してください:
$ hexdump -C binfile
00000000 55 89 e5 83 ec 04 8b 45 08 0f af 45 08 89 45 fc |U......E...E..E.|
00000010 8b 45 fc 83 c0 02 c9 c3 |.E......|
00000018