GNU/Linux >> Tutoriales Linux >  >> Linux

¿Hay alguna manera de hacer que gcc genere binarios sin formato?

Puedes usar objcopy para sacar el segmento de texto del archivo .o o del archivo 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    

Puede pasar opciones al enlazador directamente con -Wl,<linker option>

La documentación relevante se copia a continuación del man gcc

-Wl, opción
Pase la opción como una opción para el enlazador. Si la opción contiene comas, se divide en múltiples opciones en las comas. Puede usar esta sintaxis para pasar un argumento a la opción. Por ejemplo, -Wl,-Map,output.map pasa -Map output.map al enlazador. Al usar el enlazador GNU, también puede obtener el mismo efecto con -Wl,-Map=output.map.

Entonces, al compilar con gcc si pasa -Wl,--oformat=binary generará un archivo binario en lugar del formato elf. Donde --oformat=binary le dice a ld para generar un archivo binario.

Esto elimina la necesidad de objcopy por separado.

Tenga en cuenta que --oformat=binary se puede expresar como OUTPUT_FORMAT("binary") desde dentro de un script de enlazador. Si desea trabajar con archivos binarios planos, existe una gran posibilidad de que se beneficie del alto nivel de control que brindan los scripts de vinculación.


Prueba esto:

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

Puedes asegurarte de que es correcto 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  

Y compárelo con el archivo 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. ¿Hay alguna manera de 'uniq' por columna?

  2. ¿Hay alguna forma de obtener el UID del usuario en una máquina Linux usando Java?

  3. En bash, ¿hay alguna forma de repetir/imprimir la última salida estándar? ¿Hay alguna variable a la que esté asignada la salida estándar?

  4. ¿Hay alguna forma de obtener time_t de 64 bits en programas de 32 bits en Linux?

  5. ¿Hay alguna forma de recortar un archivo NETCDF?

Obtenga la primera línea de la salida de un comando de shell

¿Hay alguna manera de reiniciar badblocks?

tcpdump:¿cómo obtener una salida grepable?

¿Hay alguna manera de obtener emoji de colores en cualquier emulador de terminal en Linux?

¿Hay alguna manera de escuchar el proceso?

¿Existe una forma rápida de obtener el último archivo en un TAR grande?