ENTRY(_start) /***************************************************************************** * Virtual and linear start addresses of the TeachOS kernel *****************************************************************************/ TEACHOS_LOW = 1M; PHDRS { boot_rodata PT_LOAD FLAGS(4); boot_text PT_LOAD FLAGS(5); boot_data PT_LOAD FLAGS(6); text PT_LOAD FLAGS(5); data PT_LOAD FLAGS(6); rodata PT_LOAD FLAGS(4); } SECTIONS { /*************************************************************************** * Load the bootstrap code into low memory. We need to be accessible in * 32-Bit mode, so we want to live down low, but we need to leave the 1MiB * hole open since some BIOS functionality resides below it. ***************************************************************************/ . = TEACHOS_LOW; /*************************************************************************** * We want to be able to be able to access all memory (linear and virtual) * during bootstrapping and operation. To achieve this, we define some * symbols at the beginning. ***************************************************************************/ _start_linear = .; _start_virtual = .; /*************************************************************************** * The bootstrapping infratructure goes first. We first place the read-only * data, followed by our code, initialized mutable data, and finally our * uninitialized mutable data. ***************************************************************************/ .boot_rodata : { KEEP(*(.boot_mbh)) *(.boot_rodata) } :boot_rodata .boot_text : { *(.boot_text) } :boot_text .boot_data : { *(.boot_data) } :boot_data .boot_bss : { *(.boot_bss) *(.boot_stack) } /*************************************************************************** * Now it is time to load the 64-bit kernel code. We virtually load it into * the upper 2GiB, while adjusting the linear load address appropriately. We * also make sure to align the loaded data onto a page boundary. ***************************************************************************/ . = ALIGN(4K); .init ALIGN(4K) : AT(ADDR (.init)) { /* * Make sure that the crt code is wrapped around the compiler generated * initialization code. */ KEEP(*crti.s.o*(.init)) KEEP(*(EXCLUDE_FILE (*crti.s.o* *crtn.s.o*) .init)) KEEP(*crtn.s.o*(.init)) } :text .fini ALIGN(4K) : AT(ADDR (.fini)) { /* * Make sure that the crt code is wrapped around the compiler generated * finalizer code. */ KEEP(*crti.s.o*(.fini)) KEEP(*(EXCLUDE_FILE (*crti.s.o* *crtn.s.o*) .fini)) KEEP(*crtn.s.o*(.fini)) } .text ALIGN(4K) : AT(ADDR (.text)) { *(.text*) } .rodata ALIGN(4K) : AT (ADDR (.rodata)) { *(.rodata) *(.rodata.*) } :rodata .ctors ALIGN(4K) : AT (ADDR (.ctors)) { KEEP(*crtbegin.o(.ctors)) KEEP(*(EXCLUDE_FILE (*crtend.o) .ctors)) KEEP(*(SORT(.ctors.*))) KEEP(*crtend.o(.ctors)) } :data .dtors ALIGN(4K) : AT (ADDR (.dtors)) { KEEP(*crtbegin.o(.dtors)) KEEP(*(EXCLUDE_FILE (*crtend.o) .dtors)) KEEP(*(SORT(.dtors.*))) KEEP(*crtend.o(.dtors)) } .data ALIGN(4K) : AT (ADDR (.data)) { *(.data*) } .bss ALIGN(4K) : AT (ADDR (.bss)) { *(COMMON) *(.bss*) } . = ALIGN(4K); _end_of_image = .; /*************************************************************************** * In accordance with the symbol definitions at the start, we generate some * symbols to mark the end of our loaded image. ***************************************************************************/ _end_virtual = ADDR(.bss) + SIZEOF(.bss); _end_linear = _end_virtual; /DISCARD/ : { *(.comment) } }