From c9747a32366f9d0f6d37970579a2661233ea40bf Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 24 Jun 2021 13:08:19 +0200 Subject: [PATCH] Kernel: Build the x86_64 kernel as an ELF32 executable Multiboot only supports ELF32 executables. This changes the build process to build an ELF32 executable which has a 32-bit entry point, but consists of mostly 64-bit code. --- Kernel/CMakeLists.txt | 29 +++++++++++++++++++++-------- Kernel/mkmap.sh | 7 ++++++- Meta/debug-kernel.sh | 12 ++++++++++-- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 4b75fd1094..e8fdefd60d 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -387,22 +387,35 @@ else() link_directories(${TOOLCHAIN_ROOT}/Kernel/lib/gcc/${SERENITY_ARCH}-pc-serenity/${GCC_VERSION}/) endif() -add_executable(Kernel ${SOURCES}) -add_dependencies(Kernel generate_EscapeSequenceStateMachine.h) +if ("${SERENITY_ARCH}" STREQUAL "i686") + set(KERNEL_TARGET Kernel32) +else() + set(KERNEL_TARGET Kernel64) +endif() -set_target_properties(Kernel PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld) +add_executable(${KERNEL_TARGET} ${SOURCES}) +add_dependencies(${KERNEL_TARGET} generate_EscapeSequenceStateMachine.h) + +set_target_properties(${KERNEL_TARGET} PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld) if (ENABLE_KERNEL_LTO) include(CheckIPOSupported) check_ipo_supported() - set_property(TARGET Kernel PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + set_property(TARGET ${KERNEL_TARGET} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) endif() -target_link_libraries(Kernel kernel_heap gcc supc++) -add_dependencies(Kernel kernel_heap) -install(TARGETS Kernel RUNTIME DESTINATION boot) +target_link_libraries(${KERNEL_TARGET} kernel_heap gcc supc++) +add_dependencies(${KERNEL_TARGET} kernel_heap) add_custom_command( - TARGET Kernel + TARGET ${KERNEL_TARGET} POST_BUILD + COMMAND ${TOOLCHAIN_PREFIX}objcopy -O elf32-i386 ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL_TARGET} ${CMAKE_CURRENT_BINARY_DIR}/Kernel + BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/Kernel +) + +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/Kernel" DESTINATION boot) + +add_custom_command( + TARGET ${KERNEL_TARGET} POST_BUILD COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/mkmap.sh ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/kernel.map DESTINATION res) diff --git a/Kernel/mkmap.sh b/Kernel/mkmap.sh index 15231e8fcd..35c112805d 100644 --- a/Kernel/mkmap.sh +++ b/Kernel/mkmap.sh @@ -1,6 +1,11 @@ #!/bin/sh tmp=$(mktemp) -nm -n Kernel | awk '{ if ($2 != "a") print; }' | uniq > "$tmp" +if [ -f Kernel32 ]; then + kernel_binary=Kernel32 +else + kernel_binary=Kernel64 +fi +nm -n $kernel_binary | awk '{ if ($2 != "a") print; }' | uniq > "$tmp" printf "%08x\n" "$(wc -l "$tmp" | cut -f1 -d' ')" > kernel.map cat "$tmp" >> kernel.map rm -f "$tmp" diff --git a/Meta/debug-kernel.sh b/Meta/debug-kernel.sh index 0f78ee6ceb..70130d11cb 100755 --- a/Meta/debug-kernel.sh +++ b/Meta/debug-kernel.sh @@ -8,9 +8,17 @@ # remote on localhost:1234. So point our debugger there, and inform # the debugger which binary to load symbols, etc from. # +if [ "$SERENITY_ARCH" = "x86_64" ]; then + gdb_arch=i386:x86-64 + kernel_binary=Kernel64 +else + gdb_arch=i386:intel + kernel_binary=Kernel +fi + exec $SERENITY_KERNEL_DEBUGGER \ - -ex "file $(dirname "$0")/../Build/${SERENITY_ARCH:-i686}/Kernel/Kernel" \ - -ex 'set arch i386:intel' \ + -ex "file $(dirname "$0")/../Build/${SERENITY_ARCH:-i686}/Kernel/$kernel_binary" \ + -ex "set arch $gdb_arch" \ -ex 'target remote localhost:1234' \ -ex "source $(dirname "$0")/serenity_gdb.py" \ "$@"