ENTRY(_start) /***************************************************************************** * Virtual and linear start addresses of the TeachOS kernel *****************************************************************************/ TEACHOS_PMA = 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_PMA; /*************************************************************************** * 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_physical = .; _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 ALIGN(4K) : AT(ADDR (.boot_rodata)) { KEEP(*(.boot_mbh)) *(.boot_rodata) } :boot_rodata .boot_text ALIGN(4K) : AT(ADDR (.boot_text)) { *(.boot_text) } :boot_text .boot_bss ALIGN(4K) : AT(ADDR (.boot_bss)) { *(.boot_bss) *(.boot_stack) } .boot_data ALIGN(4K) : AT(ADDR (.boot_data)) { *(.boot_data) } :boot_data /*************************************************************************** * Now it is time to load the 64-bit kernel code. We * make sure to align the loaded data onto a page boundary. ***************************************************************************/ .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)) } .stl_text ALIGN(4K) : AT(ADDR (.stl_text)) { *(.stl_text .stl_text*) KEEP(*libstdc++.a:*(.text .text.*)) } .text ALIGN(4K) : AT(ADDR (.text)) { *(.text .text.*) } .user_text ALIGN(4K) : AT(ADDR (.user_text)) { *(.user_text .user_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)) } .bss ALIGN(4K) : AT (ADDR (.bss)) { *(COMMON) *(.bss*) } .data ALIGN(4K) : AT (ADDR (.data)) { *(.data*) } .user_data ALIGN(4K) : AT (ADDR (.user_data)) { *(.user_data .user_data.*) } /*************************************************************************** * 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_physical = _end_virtual; /DISCARD/ : { *(.comment) } }