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(0x1000) { */kernel.o(.*) */kernel.o(.bss) } >KERNEL_VMA APPLICATION : AT(LOADADDR(KERNEL) + SIZEOF(KERNEL)) { */apps.o(.*) } >APPLICATION_VMA ELF : AT(LOADADDR(APPLICATION) + SIZEOF(APPLICATION)) { */apps_raw.o(.*) } >APPLICATION_VMA .bss : AT(LOADADDR(ELF) + SIZEOF(ELF)) { } >KERNEL_VMA } __SS_LMA = LOADADDR(BOOT); __SS_VMA = ADDR(BOOT); __SS_SIZE = SIZEOF(BOOT); __KERNEL_LMA = LOADADDR(KERNEL); __KERNEL_VMA = ADDR(KERNEL); __KERNEL_SIZE = SIZEOF(KERNEL); __APP_LMA = LOADADDR(APPLICATION); __APP_VMA = ADDR(APPLICATION); __APP_SIZE = SIZEOF(APPLICATION); __ELF_LMA = LOADADDR(ELF); __ELF_VMA = ADDR(ELF); __ELF_SIZE = SIZEOF(ELF); __KERNEL_STACK_ADDR = 0xC0400000; ASSERT(__SS_SIZE + __KERNEL_SIZE + __APP_SIZE + __ELF_SIZE <= 0x48 * 0x200, "bootloader payload too big!");