GNU/Linux >> Linux Esercitazione >  >> Linux

C'è un modo per ottenere da gcc l'output binario grezzo?

Puoi usare objcopy per estrarre il segmento di testo dal file .o o dal file 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    

Puoi passare le opzioni al linker direttamente con -Wl,<linker option>

La relativa documentazione è copiata di seguito dal man gcc

-Wl,opzione
Passa l'opzione come opzione al linker. Se l'opzione contiene virgole, viene suddivisa in più opzioni in corrispondenza delle virgole. È possibile utilizzare questa sintassi per passare un argomento all'opzione. Ad esempio,-Wl,-Map,output.map passa -Map output.map al linker. Quando usi il linker GNU, puoi anche ottenere lo stesso effetto con -Wl,-Map=output.map.

Quindi quando compili con gcc se passi -Wl,--oformat=binary genererai un file binario invece del formato elf. Dove --oformat=binary dice ld per generare un file binario.

Questo elimina la necessità di objcopy separatamente.

Nota che --oformat=binary può essere espresso come OUTPUT_FORMAT("binary") dall'interno di uno script linker. Se vuoi gestire i file binari flat, c'è una grande possibilità che tu possa trarre vantaggio dall'elevato livello di controllo fornito dagli script del linker.


Prova questo:

$ gcc -c test.c     
$ objcopy -O binary -j .text test.o binfile

Puoi assicurarti che sia corretto con 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  

E confrontalo con il file binario:

$ 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:possiamo ottenere informazioni sul compilatore da un binario elfo?

  2. C'è un modo per "uniq" per colonna?

  3. C'è un modo per ascoltare il processo?

  4. C'è un modo rapido per ottenere l'ultimo file in un TAR di grandi dimensioni?

  5. C'è un modo per ottenere l'utilizzo corrente di txqueue ad es. dispositivo eth0 o tun?

C'è un modo per ottenere l'ID chiave della firma di un RPM installato in modo programmatico?

In bash, c'è un modo per echo/stampare l'ultimo stdout? Esiste una variabile a cui è assegnato stdout?

C'è un modo per ritagliare un file NETCDF?

come ottenere sha1sum per l'output binario?

tcpdump:come ottenere un output grepable?

C'è un modo per ottenere emoji colorati in qualsiasi emulatore di terminale su Linux?