OUTPUT_ARCH(i386) OUTPUT_FORMAT(elf32-i386) PAGE_SIZE = 1 << 12; MEMORY { BOOT_STAGE1 : ORIGIN = 0x00007C00, LENGTH = 0x00000200 BOOT_STAGE2 : ORIGIN = 0x00010000, LENGTH = 0x00090000 KERNEL : ORIGIN = 0xC0000000, LENGTH = 0x30000000 APPLICATION : ORIGIN = 0x10000000, LENGTH = 0xB0000000 } SECTIONS { BOOT_STAGE1 : AT(0x0000) { */boot_stage1.o(.*) . = 510; BYTE(0x55) BYTE(0xAA) } >BOOT_STAGE1 BOOT_STAGE2 : AT(LOADADDR(BOOT_STAGE1) + SIZEOF(BOOT_STAGE1)) { */boot_stage2.o(.*) } >BOOT_STAGE2 KERNEL : AT(LOADADDR(BOOT_STAGE2) + SIZEOF(BOOT_STAGE2)) { */kernel.o(.*) */kernel.o(.bss) } >KERNEL APPLICATION : AT(LOADADDR(KERNEL) + SIZEOF(KERNEL)) { } >APPLICATION .bss : AT(LOADADDR(APPLICATION) + SIZEOF(APPLICATION)) { } >KERNEL } __SS_LMA = LOADADDR(BOOT_STAGE2); __SS_VMA = ADDR(BOOT_STAGE2); __SS_SIZE = SIZEOF(BOOT_STAGE2); __KERNEL_LMA = LOADADDR(KERNEL); __KERNEL_VMA = ADDR(KERNEL); __KERNEL_SIZE = SIZEOF(KERNEL); __APP_LMA = LOADADDR(APPLICATION); __APP_VMA = ADDR(APPLICATION); __APP_SIZE = SIZEOF(APPLICATION); __KERNEL_STACK_ADDR = 0xC0400000; ASSERT(__SS_SIZE + __KERNEL_SIZE + __APP_SIZE <= 0x48 * 0x200, "bootloader payload too big!");