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