error: no multiboot header found

4k Views Asked by At

This day found something that caught my attention. is build a simple bare OS

i read how to make multiboot compliant, I'm using NASM and GCC, i need make a loader that has the multiboot header and call the main point of my system for that i have two files loader.asm and loader.ld

loader.asm
[BITS 32]
global start
start:
    mov esp, _sys_stack
    jmp stublet

ALIGN 4
mboot:
    MBOOT_PAGE_ALIGN        equ 1<<0
    MBOOT_MEMORY_INFO       equ 1<<1
    MBOOT_HEADER_MAGIC      equ 0x1BADB002
    MBOOT_HEADER_FLAGS      equ MBOOT_PAGE_ALIGN | MBOOT_MEMORY_INFO
    MBOOT_CHECKSUM          equ -(MBOOT_HEADER_MAGIC + MBOOT_HEADER_FLAGS)

    ; This is the GRUB Multiboot header. A boot signature
    dd MBOOT_HEADER_MAGIC
    dd MBOOT_HEADER_FLAGS
    dd MBOOT_CHECKSUM

stublet:
    EXTERN cmain
    call cmain
    jmp $
SECTION .bss
    resb 8192

_sys_stack:
loader.ld
ENTRY(start)
phys = 0x00100000;
SECTIONS
{
    .text phys : AT(phys) {
        code = .;
        *(.text)
        *(.rodata)
        . = ALIGN(4096);
    }
    .data : AT(phys + (data - code))
    {
        data = .;
        *(.data)
        . = ALIGN(4096);
    }
    .bss : AT(phys + (bss - code))
    {
        bss = .;
        *(.bss)
        . = ALIGN(4096);
    }
    end = .;
}
main.c
int GenyKernel_Main()
{
    char *str = "Hello world!", *ch;
    unsigned short *vidmem = (unsigned short*) VIDEO_MEMORY;
    unsigned i;

    for (ch = str, i = 0; *ch; ch++, i++) {
        vidmem[i] = (unsigned char) *ch | 0x0700;
    }

    return 0;
} 

for build i'm using

# loader.o
nasm -f elf64 -o loader.o loader.asm
# main.o
gcc -fno-stack-protector -fno-builtin -nostdinc -O -g -Wall -I. -c -o main.o main.c 

and the finally link

ld -T loader.ld -o kernel loader.o main.o

I've built a simple iso with grub-mkrescue and run with qemu but always I get

enter image description here

I think the problem is in the file loader.ld but i can't found where

1

There are 1 best solutions below

0
On BEST ANSWER

After read lots about the same .asm file i finally understood the problem, the following snippet

align 4
multiboot_header:
    dd MBOOT_MAGIC
    dd MBOOT_FLAGS
    dd MBOOT_CHECKSUM

must exist below a section to include appropriately with the linker

section .text ; .multiboot o whatever
align 4
multiboot_header:
    dd MBOOT_MAGIC
    dd MBOOT_FLAGS
    dd MBOOT_CHECKSUM

and in the linker script

ENTRY(your_entry_point)
SECTIONS
{
  . = 0x00100000;
  .text ALIGN(0x1000) :
  {
    *(.multiboot)
    *(.text)
  }
  // rest of sections
}