GNU/Linux >> Tutoriels Linux >  >> Linux

Existe-t-il un moyen de faire en sorte que gcc produise du binaire brut?

Vous pouvez utiliser objcopy pour extraire le segment de texte du fichier .o ou du fichier 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    

Vous pouvez passer des options au linker directement avec -Wl,<linker option>

La documentation pertinente est copiée ci-dessous à partir du man gcc

-Wl, option
Passer l'option en tant qu'option à l'éditeur de liens. Si l'option contient des virgules, elle est divisée en plusieurs options au niveau des virgules. Vous pouvez utiliser cette syntaxe pour passer un argument à l'option. Par exemple, -Wl,-Map,output.map passe -Map output.map à l'éditeur de liens. Lorsque vous utilisez l'éditeur de liens GNU, vous pouvez également obtenir le même effet avec -Wl,-Map=output.map.

Donc lors de la compilation avec gcc si vous passez -Wl,--oformat=binary vous allez générer un fichier binaire au lieu du format elf. Où --oformat=binary dit ld pour générer un fichier binaire.

Cela supprime le besoin de objcopy séparément.

Notez que --oformat=binary peut être exprimé sous la forme OUTPUT_FORMAT("binary") à partir d'un script de l'éditeur de liens. Si vous souhaitez gérer des fichiers binaires plats, il y a de fortes chances que vous bénéficiiez du haut niveau de contrôle fourni par les scripts de l'éditeur de liens.


Essayez ceci :

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

Vous pouvez vous assurer qu'il est correct avec 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  

Et comparez-le avec le fichier binaire :

$ 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. Existe-t-il un moyen d'obtenir par programme l'ID de clé de signature d'un RPM installé ?

  2. Le meilleur moyen d'obtenir l'identifiant de la machine sous Linux ?

  3. Existe-t-il un moyen d'obtenir time_t 64 bits dans des programmes 32 bits sous Linux ?

  4. Obtenir la première ligne de la sortie d'une commande shell

  5. comment obtenir sha1sum pour sortir le binaire?

Existe-t-il un moyen de redémarrer les badblocks ?

tcpdump :comment obtenir une sortie grepable ?

Existe-t-il un moyen d'obtenir des emoji colorés dans n'importe quel émulateur de terminal sous Linux ?

Existe-t-il un moyen d'obtenir la version du BIOS depuis Linux ?

Existe-t-il un moyen d'obtenir les ratios Cache Hit/Miss pour les périphériques de bloc sous Linux ?

Existe-t-il un moyen d'obtenir l'utilisation actuelle de txqueue, par exemple. périphérique eth0 ou tun ?