Sie können objcopy
verwenden um das Textsegment aus der .o-Datei oder der a.out-Datei zu ziehen.
$ 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
Mit -Wl,<linker option>
können Sie Optionen direkt an den Linker übergeben
Die entsprechende Dokumentation ist unten aus dem man gcc
kopiert
-Wl,Option
Option als Option an den Linker übergeben. Wenn die Option Kommas enthält, wird sie an den Kommas in mehrere Optionen aufgeteilt. Sie können diese Syntax verwenden, um ein Argument an die Option zu übergeben. Beispielsweise übergibt -Wl,-Map,output.map -Map output.map an den Linker. Wenn Sie den GNU-Linker verwenden, können Sie den gleichen Effekt auch mit -Wl,-Map=output.map.
Wenn Sie also mit gcc kompilieren, übergeben Sie -Wl,--oformat=binary
Sie werden eine Binärdatei anstelle des Elf-Formats generieren. Wobei --oformat=binary
sagt ld
um eine Binärdatei zu generieren.
Dadurch entfällt die Notwendigkeit von objcopy
separat.
Beachten Sie, dass --oformat=binary
kann als OUTPUT_FORMAT("binary")
ausgedrückt werden aus einem Linker-Skript heraus. Wenn Sie mit flachen Binärdateien arbeiten möchten, besteht eine große Chance, dass Sie von dem hohen Maß an Kontrolle profitieren würden, das Linker-Skripte bieten.
Probieren Sie es aus:
$ gcc -c test.c
$ objcopy -O binary -j .text test.o binfile
Sie können sich mit objdump
vergewissern, dass es richtig ist :
$ 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
Und vergleichen Sie es mit der Binärdatei:
$ 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