GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Gibt es eine Möglichkeit, gcc dazu zu bringen, rohe Binärdateien auszugeben?

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.

erzielen

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

Linux
  1. Linux – Können wir Compiler-Informationen aus einer Elf-Binärdatei erhalten?

  2. Gibt es eine Möglichkeit, die Signaturschlüssel-ID eines installierten RPM programmgesteuert abzurufen?

  3. Gibt es eine Möglichkeit, eine NETCDF-Datei zuzuschneiden?

  4. Wie bekomme ich sha1sum dazu, binär auszugeben?

  5. Gibt es eine Möglichkeit, Text in htop zu kopieren?

Gibt es eine Möglichkeit, 64-Bit-time_t in 32-Bit-Programmen unter Linux zu erhalten?

Ruft die erste Zeile der Ausgabe eines Shell-Befehls ab

Gibt es eine Möglichkeit, Badblocks neu zu starten?

tcpdump:Wie bekomme ich eine grepable Ausgabe?

Gibt es eine Möglichkeit, farbige Emojis in einem Terminalemulator unter Linux zu erhalten?

Gibt es eine Möglichkeit, Cache-Hit/Miss-Verhältnisse für Blockgeräte in Linux zu erhalten?