GNU/Linux >> Znalost Linux >  >> Linux

Existuje způsob, jak přimět gcc k výstupu surového binárního kódu?

Můžete použít objcopy vytáhněte textový segment ze souboru .o nebo 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    

Možnosti můžete předat linkeru přímo pomocí -Wl,<linker option>

Příslušná dokumentace je zkopírována níže z man gcc

-Wl, možnost
Předat možnost jako možnost linkeru. Pokud volba obsahuje čárky, je rozdělena na více možností u čárek. Tuto syntaxi můžete použít k předání argumentu volbě. Například -Wl,-Map,output.map předá -Map output.map linkeru. Při použití GNU linkeru můžete získat stejný efekt také pomocí-Wl,-Map=output.map.

Takže při kompilaci s gcc, pokud předáte -Wl,--oformat=binary namísto formátu elf vygenerujete binární soubor. Kde --oformat=binary říká ld vygenerovat binární soubor.

To odstraňuje potřebu objcopy samostatně.

Všimněte si, že --oformat=binary lze vyjádřit jako OUTPUT_FORMAT("binary") ze skriptu linkeru. Pokud se chcete vypořádat s plochými binárními soubory, je velká šance, že budete mít prospěch z vysoké úrovně kontroly, kterou poskytují skripty linkeru.


Vyzkoušejte toto:

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

Můžete se ujistit, že je to správné pomocí 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  

A porovnejte jej s binárním souborem:

$ 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 – Můžeme získat informace o kompilátoru z binárního souboru Elf?

  2. Existuje způsob, jak programově získat ID podpisového klíče nainstalovaného RPM?

  3. Nejlepší způsob, jak získat ID stroje v Linuxu?

  1. jak dostat sha1sum na binární výstup?

  2. Existuje způsob, jak zkopírovat text v htop?

  3. Existuje způsob, jak získat verzi systému BIOS z Linuxu?

  1. Existuje způsob, jak „uniq“ podle sloupce?

  2. Existuje rychlý způsob, jak získat úplně poslední soubor ve velkém TAR?

  3. Existuje způsob, jak získat aktuální využití txqueue např. zařízení eth0 nebo tun?