mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-30 00:31:14 +00:00
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.
This commit is contained in:
parent
04ba5cfcad
commit
c9747a3236
Notes:
sideshowbarker
2024-07-18 11:33:05 +09:00
Author: https://github.com/gunnarbeutner Commit: https://github.com/SerenityOS/serenity/commit/c9747a32366 Pull-request: https://github.com/SerenityOS/serenity/pull/8240
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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" \
|
||||
"$@"
|
||||
|
|
Loading…
Reference in a new issue