diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2025-12-29 14:43:20 +0100 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2025-12-29 14:43:20 +0100 |
| commit | fb1c180c431e3ac07ca56f53299edea316883842 (patch) | |
| tree | 60344689657d6c9512c697e3ac714709cc3c958c /arch/x86_64/scripts | |
| parent | c522a3634e0cd20804b1e3216caedd5e15cbee19 (diff) | |
| download | teachos-fb1c180c431e3ac07ca56f53299edea316883842.tar.xz teachos-fb1c180c431e3ac07ca56f53299edea316883842.zip | |
x86_64/boot: fix section assignments in ld script
Diffstat (limited to 'arch/x86_64/scripts')
| -rw-r--r-- | arch/x86_64/scripts/kernel.ld | 133 |
1 files changed, 66 insertions, 67 deletions
diff --git a/arch/x86_64/scripts/kernel.ld b/arch/x86_64/scripts/kernel.ld index 064b8d7..9a5dfd8 100644 --- a/arch/x86_64/scripts/kernel.ld +++ b/arch/x86_64/scripts/kernel.ld @@ -3,17 +3,21 @@ ENTRY(_start) /***************************************************************************** * Virtual and linear start addresses of the TeachOS kernel *****************************************************************************/ -TEACHOS_PMA = 1M; -TEACHOS_VMA = 0xFFFFFFFF80000000; +PROVIDE_HIDDEN(TEACHOS_PMA = 1M); +PROVIDE_HIDDEN(TEACHOS_VMA = -2048M); 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); + kernel_rodata PT_LOAD FLAGS(4); + kernel_text PT_LOAD FLAGS(5); + kernel_data PT_LOAD FLAGS(6); + + user_rodata PT_LOAD FLAGS(4); + user_text PT_LOAD FLAGS(5); + user_data PT_LOAD FLAGS(6); } SECTIONS @@ -30,104 +34,99 @@ SECTIONS * during bootstrapping and operation. To achieve this, we define some * symbols at the beginning. ***************************************************************************/ - _start_physical = .; - _start_virtual = . + TEACHOS_VMA; - + PROVIDE_HIDDEN(_start_physical = .); + PROVIDE_HIDDEN(_start_virtual = . + TEACHOS_VMA); - /*************************************************************************** - * 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)) + .boot_rodata ALIGN(4K) : { - KEEP(*(.boot_mbh)) - *(.boot_rodata) + KEEP(*(.boot_mbh .boot_rodata*)) } :boot_rodata - .boot_text ALIGN(4K) : AT(ADDR (.boot_text)) + .boot_data ALIGN(4K) : { - *(.boot_text) - } :boot_text + KEEP(*(.boot_data*)) - .boot_bss ALIGN(4K) : AT(ADDR (.boot_bss)) - { - *(.boot_bss) - *(.boot_stack) - } + PROVIDE_HIDDEN(__init_array_start = .); + KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN(__init_array_end = .); + } :boot_data - .boot_data ALIGN(4K) : AT(ADDR (.boot_data)) + .boot_bss ALIGN(4K) : { - *(.boot_data) + KEEP(*(.boot_stack .boot_bss*)) } :boot_data + .boot_text ALIGN(4K) : + { + KEEP(*(.boot_text*)) + } :boot_text + /*************************************************************************** - * Now it is time to load the 64-bit kernel code. We - * make sure to align the loaded data onto a page boundary. + * Now it is time to load the 64-bit kernel code. We make sure to align the + * loaded data onto a page boundary. ***************************************************************************/ . = ALIGN(4K); . += TEACHOS_VMA; - .stl_text ALIGN(4K) : AT(ADDR (.stl_text) - TEACHOS_VMA) + .kernel_rodata ALIGN(4K) : AT (ADDR (.kernel_rodata) - TEACHOS_VMA) { - *(.stl_text .stl_text*) - KEEP(*libstdc++.a:*(.text .text.*)) - } :text + *(EXCLUDE_FILE (*libstdc++.a:*) .rodata*) + } :kernel_rodata - .text ALIGN(4K) : AT(ADDR (.text) - TEACHOS_VMA) + .kernel_data ALIGN(4K) : AT (ADDR (.kernel_data) - TEACHOS_VMA) { - *(.text .text.*) - } + *(EXCLUDE_FILE (*libstdc++.a:*) .data*) + } :kernel_data - .user_text ALIGN(4K) : AT(ADDR (.user_text) - TEACHOS_VMA) - { - *(.user_text .user_text.*) - } + . += 4K; - .rodata ALIGN(4K) : AT (ADDR (.rodata) - TEACHOS_VMA) + .kernel_bss ALIGN(4K) : AT (ADDR (.kernel_bss) - TEACHOS_VMA) { - *(.rodata) - *(.rodata.*) - } :rodata + *(EXCLUDE_FILE (*libstdc++.a:*) .stack .bss*) + } :kernel_data - .ctors ALIGN(4K) : AT (ADDR (.ctors) - TEACHOS_VMA) + .kernel_text ALIGN(4K) : AT(ADDR (.kernel_text) - TEACHOS_VMA) { - __ctors_start = .; - KEEP(*(SORT(.ctors.*))) - KEEP(*(.ctors)) - __ctors_end = .; - } :data + *(EXCLUDE_FILE (*libstdc++.a:*) .text*) + } :kernel_text + + /*************************************************************************** + * Finally, we load the user-accessible code and data. + ***************************************************************************/ - .init_array ALIGN(4K) : AT (ADDR (.init_array) - TEACHOS_VMA) + .user_rodata ALIGN(4K) : AT (ADDR (.user_rodata) - TEACHOS_VMA) { - __init_array_start = .; - KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*))) - KEEP(*(.init_array)) - __init_array_end = .; - } + *(.stl_rodata* .user_rodata*) + KEEP(*libstdc++.a:*(.rodata*)) + } :user_rodata - .bss ALIGN(4K) : AT (ADDR (.bss) - TEACHOS_VMA) + .user_data ALIGN(4K) : AT (ADDR (.user_data) - TEACHOS_VMA) { - *(COMMON) - *(.bss*) - } + *(.stl_data* .user_data*) + KEEP(*libstdc++.a:*(.data*)) + } :user_data + + . += 4K; - .data ALIGN(4K) : AT (ADDR (.data) - TEACHOS_VMA) + .user_bss ALIGN(4K) : AT(ADDR (.user_bss) - TEACHOS_VMA) { - *(.data*) - } + *(.stl_bss* .user_bss*) + KEEP(*libstdc++.a:*(.bss*)) + } :user_data - .user_data ALIGN(4K) : AT (ADDR (.user_data) - TEACHOS_VMA) + .user_text ALIGN(4K) : AT(ADDR (.user_text) - TEACHOS_VMA) { - *(.user_data .user_data.*) - } + KEEP(*(.stl_text* .user_text*)) + KEEP(*libstdc++.a:*(.text*)) + } :user_text /*************************************************************************** * In accordance with the symbol definitions at the start, we generate some * symbols to mark the end of our loaded image. ***************************************************************************/ - _end_virtual = .; - _end_physical = _end_virtual - TEACHOS_VMA; + PROVIDE_HIDDEN(_end_virtual = .); + PROVIDE_HIDDEN(_end_physical = _end_virtual - TEACHOS_VMA); /DISCARD/ : { *(.comment) } } |
