texto - ¿Cuáles son estos bytes adicionales en mi archivo binario?
modificar un archivo binario en c (2)
Estoy en el proceso de escribir un pequeño sistema operativo en C. He escrito un gestor de arranque y ahora estoy tratando de obtener un archivo C simple (el "kernel") para compilar con gcc
:
int main(void) { return 0; }
Compilo el archivo con el siguiente comando:
gcc kernel.c -o kernel.o -nostdlib -nostartfiles
Uso el enlazador para crear la imagen final usando este comando:
ld kernel.o -o kernel.bin -T linker.ld --oformat=binary
El contenido del archivo linker.ld
es el siguiente:
SECTIONS { . = 0x7e00; .text ALIGN (0x00) : { *(.text) } }
(El gestor de arranque carga la imagen en la dirección 0x7e00
).
Esto parece funcionar bastante bien: ld
produce un archivo de 128 bytes que contiene las siguientes instrucciones en los primeros 11 bytes:
00000000 55 push ebp 00000001 48 dec eax 00000002 89 E5 mov ebp, esp 00000004 B8 00 00 00 00 mov eax, 0x00000000 00000009 5D pop ebp 0000000A C3 ret
Sin embargo, no puedo entender para qué son los otros 117 bytes. Desmontarlos parece producir un montón de basura que no tiene ningún sentido. La existencia de los bytes adicionales me hace preguntarme si estoy haciendo algo mal.
¿Debería Preocuparme?
Estas son secciones adicionales, que no fueron eliminadas ni descartadas. Desea que su archivo linker.ld
vea así:
SECTIONS
{
. = 0x7e00;
.text ALIGN (0x00) :
{
*(.text)
}
/DISCARD/ :
{
*(.comment)
*(.eh_frame_hdr)
*(.eh_frame)
}
}
Sé qué secciones desechar de la salida de objdump -t kernel.o
.
Simple, estás usando gcc, y siempre pone su código de inicialización antes de pasar el control a tu main. Lo que está en ese código de inicio no lo sé, pero están ahí. Como puede ver, también hay un comentario ''GNU'' en su binario, no puede imprimir sectores específicos usando objdump -s -j ''nombre de sección''.