diff --git a/Kernel/Prekernel/linker.ld b/Kernel/Prekernel/Arch/aarch64/linker.ld similarity index 100% rename from Kernel/Prekernel/linker.ld rename to Kernel/Prekernel/Arch/aarch64/linker.ld diff --git a/Kernel/Prekernel/Arch/x86/linker.ld b/Kernel/Prekernel/Arch/x86/linker.ld new file mode 100644 index 00000000000..12045205408 --- /dev/null +++ b/Kernel/Prekernel/Arch/x86/linker.ld @@ -0,0 +1,47 @@ +ENTRY(start) + +PHDRS +{ + boot_text PT_LOAD ; + text PT_LOAD ; + data PT_LOAD ; + bss PT_LOAD ; +} + +SECTIONS +{ + . = 0x00100000; + + start_of_prekernel_image = .; + + .boot_text ALIGN(4K) : AT (ADDR(.boot_text)) + { + KEEP(*(.multiboot)) + } :boot_text + + .text ALIGN(4K) : AT (ADDR(.text)) + { + start_of_prekernel_text = .; + *(.text*) + } :text + + .rodata ALIGN(4K) : AT (ADDR(.rodata)) + { + *(.rodata*) + } :data + + .data ALIGN(4K) : AT (ADDR(.data)) + { + *(.data*) + } :data + + .bss ALIGN(4K) (NOLOAD) : AT (ADDR(.bss)) + { + *(COMMON) + *(.bss) + *(.stack) + *(.page_tables) + } :bss + + end_of_prekernel_image = .; +} diff --git a/Kernel/Prekernel/CMakeLists.txt b/Kernel/Prekernel/CMakeLists.txt index 952cbb3371e..df638c5b062 100644 --- a/Kernel/Prekernel/CMakeLists.txt +++ b/Kernel/Prekernel/CMakeLists.txt @@ -44,8 +44,13 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static") add_executable(${PREKERNEL_TARGET} ${SOURCES}) target_compile_options(${PREKERNEL_TARGET} PRIVATE -no-pie -fno-pic -fno-threadsafe-statics) -target_link_options(${PREKERNEL_TARGET} PRIVATE LINKER:-T ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld -nostdlib LINKER:--no-pie) -set_target_properties(${PREKERNEL_TARGET} PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld) +if ("${SERENITY_ARCH}" STREQUAL "aarch64") + set(PREKERNEL_LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/Arch/aarch64/linker.ld") +else() + set(PREKERNEL_LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/linker.ld") +endif() +target_link_options(${PREKERNEL_TARGET} PRIVATE LINKER:-T ${PREKERNEL_LINKER_SCRIPT} -nostdlib LINKER:--no-pie) +set_target_properties(${PREKERNEL_TARGET} PROPERTIES LINK_DEPENDS ${PREKERNEL_LINKER_SCRIPT}) if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") target_link_libraries(${PREKERNEL_TARGET} PRIVATE gcc)