diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2025-07-17 21:09:02 +0000 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2025-07-18 13:02:34 +0200 |
| commit | 14ed096fc5de6844cb116f3319c0d03043d26ea2 (patch) | |
| tree | e78cc753b2d6dcabd703aebc4b9bea1783cc2e6d /arch/x86_64/scripts | |
| parent | 891ca8834122e55638d33a129baab7292b8ed6d0 (diff) | |
| download | teachos-14ed096fc5de6844cb116f3319c0d03043d26ea2.tar.xz teachos-14ed096fc5de6844cb116f3319c0d03043d26ea2.zip | |
x86-64: prepare new architecture
Diffstat (limited to 'arch/x86_64/scripts')
| -rw-r--r-- | arch/x86_64/scripts/x86-64-linker-script.txt | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/arch/x86_64/scripts/x86-64-linker-script.txt b/arch/x86_64/scripts/x86-64-linker-script.txt new file mode 100644 index 0000000..3d9a7ae --- /dev/null +++ b/arch/x86_64/scripts/x86-64-linker-script.txt @@ -0,0 +1,150 @@ +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 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_linear = _end_virtual; + + /DISCARD/ : { *(.comment) } +} |
