OUTPUT_ARCH(i386) OUTPUT_FORMAT(elf32-i386) PAGE_SIZE = 1 << 12; MEMORY { BOOT_VMA : ORIGIN = 0x00007C00, LENGTH = 0x00001000 KERNEL_VMA : ORIGIN = 0xC0000000, LENGTH = 0x30000000 APPLICATION_VMA : ORIGIN = 0x10000000, LENGTH = 0xB0000000 } SECTIONS { BOOT : AT(0x0000) { */boot.o(.*) } >BOOT_VMA KERNEL : AT(0x5E00) { */kernel.o(.*) */kernel.o(.bss) } >KERNEL_VMA APPLICATION : AT(LOADADDR(KERNEL) + SIZEOF(KERNEL)) { */apps.o(.*) } >APPLICATION_VMA ELF : AT(0xB600) { */apps_raw.o(.*) } >APPLICATION_VMA .bss : AT(LOADADDR(ELF) + SIZEOF(ELF)) { } >KERNEL_VMA } __BOOT_LMA = LOADADDR(BOOT); __BOOT_VMA = ADDR(BOOT); __BOOT_SIZE = SIZEOF(BOOT); __KERNEL_LMA = LOADADDR(KERNEL); __KERNEL_VMA = ADDR(KERNEL); __KERNEL_SIZE = SIZEOF(KERNEL); __ELF_LMA = LOADADDR(ELF); __ELF_VMA = ADDR(ELF); __ELF_SIZE = SIZEOF(ELF); __KERNEL_STACK_ADDR = 0xC0400000; ASSERT(__BOOT_SIZE <= 0x1000, "bootloader too big!"); ASSERT(__KERNEL_SIZE <= 0x5000, "bootloader too big!"); ASSERT(__ELF_SIZE <= 0x3000, "bootloader too big!");