Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are these extra bytes in my binary file?

I am in the process of writing a small operating system in C. I have written a bootloader and I'm now trying to get a simple C file (the "kernel") to compile with gcc:

int main(void) { return 0; }

I compile the file with the following command:

gcc kernel.c -o kernel.o -nostdlib -nostartfiles

I use the linker to create the final image using this command:

ld kernel.o -o kernel.bin -T linker.ld --oformat=binary

The contents of the linker.ld file are as follows:

SECTIONS
{
    . = 0x7e00;

    .text ALIGN (0x00) :
    {
        *(.text)
    }
}

(The bootloader loads the image at address 0x7e00.)

This seems to work quite well - ld produces a 128-byte file containing the following instructions in the first 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

However, I can't figure out what the other 117 bytes are for. Disassembling them seems to produce a bunch of garbage that doesn't make any sense. The existence of the additional bytes has me wondering if I'm doing something wrong.

Should I be concerned?

hexdump of the file

like image 512
Nathan Osman Avatar asked Jul 23 '12 18:07

Nathan Osman


People also ask

What is stored in binary file?

Binary files can be used to store any data; for example, a JPEG image is a binary file designed to be read by a computer system. The data inside a binary file is stored as raw bytes, which is not human readable.

What is the ending of a binary file?

In DOS and Windows, the end of file character is 26. When a byte with this value is read in text mode, the file is considered ended and your program cannot read any more information from the file. UNIX considers the end-of-file character to be 4.


1 Answers

These are additional sections, which were not stripped and not discarded. You want your linker.ld file to look like this:

SECTIONS
{
    . = 0x7e00;

    .text ALIGN (0x00) :
    {
        *(.text)
    }

    /DISCARD/ :
    {
        *(.comment)
        *(.eh_frame_hdr)
        *(.eh_frame)
    }
}

I know what sections to discard from the output of objdump -t kernel.o.

like image 164
xaizek Avatar answered Sep 24 '22 19:09

xaizek