diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 4cb0bf6b3a5..bdf8e60fbfa 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -356,11 +356,9 @@ 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) @@ -396,8 +394,18 @@ endif() add_executable(Kernel ${SOURCES}) add_dependencies(Kernel generate_EscapeSequenceStateMachine.h) -target_link_options(Kernel PRIVATE LINKER:-T ${KERNEL_LINKER_SCRIPT} -nostdlib) -set_target_properties(Kernel PROPERTIES LINK_DEPENDS ${KERNEL_LINKER_SCRIPT}) +add_custom_command( + OUTPUT linker.ld + COMMAND "${CMAKE_CXX_COMPILER}" -E -P -x c -I${CMAKE_CURRENT_SOURCE_DIR}/.. "${CMAKE_CURRENT_SOURCE_DIR}/linker.ld" -o "${CMAKE_CURRENT_BINARY_DIR}/linker.ld" + MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/linker.ld" + COMMENT "Preprocessing linker.ld" + VERBATIM +) + +add_custom_target(generate_kernel_linker_script DEPENDS linker.ld) + +target_link_options(Kernel PRIVATE LINKER:-T ${CMAKE_CURRENT_BINARY_DIR}/linker.ld -nostdlib) +set_target_properties(Kernel PROPERTIES LINK_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/linker.ld") if (ENABLE_KERNEL_LTO) include(CheckIPOSupported) diff --git a/Kernel/linker_amd64.ld b/Kernel/linker.ld similarity index 92% rename from Kernel/linker_amd64.ld rename to Kernel/linker.ld index c50c1be66c6..18db2e42dab 100644 --- a/Kernel/linker_amd64.ld +++ b/Kernel/linker.ld @@ -1,6 +1,14 @@ +#include + ENTRY(init) -KERNEL_VIRTUAL_BASE = 0x2000000000; +#if ARCH(I386) +# define KERNEL_BASE 0xc0000000 +#else +# define KERNEL_BASE 0x2000000000 +#endif + +KERNEL_VIRTUAL_BASE = KERNEL_BASE; PHDRS { diff --git a/Kernel/linker_i386.ld b/Kernel/linker_i386.ld deleted file mode 100644 index 0c967f30e0b..00000000000 --- a/Kernel/linker_i386.ld +++ /dev/null @@ -1,96 +0,0 @@ -ENTRY(init) - -KERNEL_VIRTUAL_BASE = 0xc0000000; - -PHDRS -{ - super_pages PT_LOAD ; - text PT_LOAD ; - data PT_LOAD ; - bss PT_LOAD ; - ksyms PT_LOAD ; -} - -SECTIONS -{ - . = KERNEL_VIRTUAL_BASE + 0x00200000; - - start_of_kernel_image = .; - - .super_pages ALIGN(4K) (NOLOAD) : AT (ADDR(.super_pages) - KERNEL_VIRTUAL_BASE) - { - *(.super_pages) - } :super_pages - - .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 = .; -}