diff options
author | Gunnar Beutner <gbeutner@serenityos.org> | 2021-07-09 00:58:43 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-07-10 01:41:57 +0200 |
commit | 06883ed8a32cc44ce5fdf26af0b5ec5ee2e2dbe7 (patch) | |
tree | f72c8f0d697bede3f9a29ea3e95a7d8d974f8393 /Userland/DynamicLoader | |
parent | f4a318ee2d868d6d4f712afa8de786bba9703e36 (diff) | |
download | serenity-06883ed8a32cc44ce5fdf26af0b5ec5ee2e2dbe7.zip |
Kernel+Userland: Make the stack alignment comply with the System V ABI
The System V ABI for both x86 and x86_64 requires that the stack pointer
is 16-byte aligned on entry. Previously we did not align the stack
pointer properly.
As far as "main" was concerned the stack alignment was correct even
without this patch due to how the C++ _start function and the kernel
interacted, i.e. the kernel misaligned the stack as far as the ABI
was concerned but that misalignment (read: it was properly aligned for
a regular function call - but misaligned in terms of what the ABI
dictates) was actually expected by our _start function.
Diffstat (limited to 'Userland/DynamicLoader')
-rw-r--r-- | Userland/DynamicLoader/CMakeLists.txt | 4 | ||||
-rw-r--r-- | Userland/DynamicLoader/main.cpp | 10 |
2 files changed, 10 insertions, 4 deletions
diff --git a/Userland/DynamicLoader/CMakeLists.txt b/Userland/DynamicLoader/CMakeLists.txt index 3e95c8a814..af20a733a2 100644 --- a/Userland/DynamicLoader/CMakeLists.txt +++ b/Userland/DynamicLoader/CMakeLists.txt @@ -10,10 +10,10 @@ file(GLOB LIBC_SOURCES2 "../Libraries/LibC/*/*.cpp") if ("${SERENITY_ARCH}" STREQUAL "i686") file(GLOB LIBC_SOURCES3 "../Libraries/LibC/arch/i386/*.S") - set(ELF_SOURCES ${ELF_SOURCES} ../Libraries/LibELF/Arch/i386/plt_trampoline.S) + set(ELF_SOURCES ${ELF_SOURCES} ../Libraries/LibELF/Arch/i386/entry.S ../Libraries/LibELF/Arch/i386/plt_trampoline.S) elseif ("${SERENITY_ARCH}" STREQUAL "x86_64") file(GLOB LIBC_SOURCES3 "../Libraries/LibC/arch/x86_64/*.S") - set(ELF_SOURCES ${ELF_SOURCES} ../Libraries/LibELF/Arch/x86_64/plt_trampoline.S) + set(ELF_SOURCES ${ELF_SOURCES} ../Libraries/LibELF/Arch/x86_64/entry.S ../Libraries/LibELF/Arch/x86_64/plt_trampoline.S) endif() file(GLOB LIBSYSTEM_SOURCES "../Libraries/LibSystem/*.cpp") diff --git a/Userland/DynamicLoader/main.cpp b/Userland/DynamicLoader/main.cpp index 6fecfbc60f..6156151aa6 100644 --- a/Userland/DynamicLoader/main.cpp +++ b/Userland/DynamicLoader/main.cpp @@ -94,9 +94,15 @@ this helper program directly. extern "C" { // The compiler expects a previous declaration -void _start(int, char**, char**); +void _entry(int, char**, char**); -void _start(int argc, char** argv, char** envp) +asm( + ".globl _start\n" + "_start:\n" + "push $0\n" + "jmp _entry@plt\n"); + +void _entry(int argc, char** argv, char** envp) { char** env; for (env = envp; *env; ++env) { |