diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index ae829d5ca3..4cb0bf6b3a 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -356,9 +356,11 @@ endif() if ("${SERENITY_ARCH}" STREQUAL "x86_64") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcmodel=large -fno-pic -mno-red-zone") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -faligned-new=8") + set(KERNEL_LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/linker_amd64.ld) else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pie -fPIE") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -faligned-new=4") + set(KERNEL_LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/linker_i386.ld) endif() # Kernel Undefined Behavior Sanitizer (KUBSAN) @@ -394,8 +396,8 @@ endif() add_executable(Kernel ${SOURCES}) add_dependencies(Kernel generate_EscapeSequenceStateMachine.h) -target_link_options(Kernel PRIVATE LINKER:-T ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld -nostdlib) -set_target_properties(Kernel PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld) +target_link_options(Kernel PRIVATE LINKER:-T ${KERNEL_LINKER_SCRIPT} -nostdlib) +set_target_properties(Kernel PROPERTIES LINK_DEPENDS ${KERNEL_LINKER_SCRIPT}) if (ENABLE_KERNEL_LTO) include(CheckIPOSupported) diff --git a/Kernel/linker_amd64.ld b/Kernel/linker_amd64.ld new file mode 100644 index 0000000000..da50c37491 --- /dev/null +++ b/Kernel/linker_amd64.ld @@ -0,0 +1,90 @@ +ENTRY(init) + +KERNEL_VIRTUAL_BASE = 0x2000000000; + +PHDRS +{ + text PT_LOAD ; + data PT_LOAD ; + bss PT_LOAD ; + ksyms PT_LOAD ; +} + +SECTIONS +{ + . = KERNEL_VIRTUAL_BASE + 0x00200000; + + start_of_kernel_image = .; + + .text ALIGN(4K) : AT (ADDR(.text) - KERNEL_VIRTUAL_BASE) + { + start_of_kernel_text = .; + + start_of_safemem_text = .; + KEEP(*(.text.safemem)) + end_of_safemem_text = .; + start_of_safemem_atomic_text = .; + KEEP(*(.text.safemem.atomic)) + end_of_safemem_atomic_text = .; + + *(.text*) + } :text + + .unmap_after_init ALIGN(4K) : AT (ADDR(.unmap_after_init) - KERNEL_VIRTUAL_BASE) + { + start_of_unmap_after_init = .; + *(.unmap_after_init*); + end_of_unmap_after_init = .; + + end_of_kernel_text = .; + } :text + + .rodata ALIGN(4K) : AT (ADDR(.rodata) - KERNEL_VIRTUAL_BASE) + { + start_heap_ctors = .; + *libkernel_heap.a:*(.ctors) + end_heap_ctors = .; + + start_ctors = .; + *(.ctors) + end_ctors = .; + + *(.rodata*) + } :data + + .data ALIGN(4K) : AT (ADDR(.data) - KERNEL_VIRTUAL_BASE) + { + start_of_kernel_data = .; + *(.data*) + end_of_kernel_data = .; + } :data + + .ro_after_init ALIGN(4K) (NOLOAD) : AT(ADDR(.ro_after_init) - KERNEL_VIRTUAL_BASE) + { + start_of_ro_after_init = .; + *(.ro_after_init); + end_of_ro_after_init = .; + } :data + + .bss ALIGN(4K) (NOLOAD) : AT (ADDR(.bss) - KERNEL_VIRTUAL_BASE) + { + start_of_kernel_bss = .; + *(page_tables) + *(COMMON) + *(.bss) + end_of_kernel_bss = .; + + . = ALIGN(4K); + *(.heap) + } :bss + + + .ksyms ALIGN(4K) : AT (ADDR(.ksyms) - KERNEL_VIRTUAL_BASE) + { + start_of_kernel_ksyms = .; + *(.kernel_symbols) + end_of_kernel_ksyms = .; + } :ksyms + + end_of_kernel_image = .; +} diff --git a/Kernel/linker.ld b/Kernel/linker_i386.ld similarity index 81% rename from Kernel/linker.ld rename to Kernel/linker_i386.ld index 899bb6c715..d73adc7657 100644 --- a/Kernel/linker.ld +++ b/Kernel/linker_i386.ld @@ -4,8 +4,6 @@ KERNEL_VIRTUAL_BASE = 0xc0000000; PHDRS { - boot_text PT_LOAD ; - boot_bss PT_LOAD ; text PT_LOAD ; data PT_LOAD ; bss PT_LOAD ; @@ -14,23 +12,10 @@ PHDRS SECTIONS { - . = KERNEL_VIRTUAL_BASE + 0x00100000; + . = KERNEL_VIRTUAL_BASE + 0x00200000; start_of_kernel_image = .; - .boot_text ALIGN(4K) : AT (ADDR(.boot_text) - KERNEL_VIRTUAL_BASE) - { - KEEP(*(.boot_text)) - KEEP(*(.multiboot)) - } :boot_text - - .boot_bss ALIGN(4K) (NOLOAD) : AT (ADDR(.boot_bss) - KERNEL_VIRTUAL_BASE) - { - KEEP(*(.page_tables)) - KEEP(*(.stack)) - *(.super_pages) - } :boot_bss - .text ALIGN(4K) : AT (ADDR(.text) - KERNEL_VIRTUAL_BASE) { start_of_kernel_text = .;