diff options
Diffstat (limited to 'arch/x86_64/scripts/kernel.ld')
| -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) } } |
