mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 07:54:58 +00:00

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.
55 lines
1.2 KiB
C++
55 lines
1.2 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <AK/Types.h>
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <sys/internals.h>
|
|
#include <unistd.h>
|
|
|
|
#ifndef _DYNAMIC_LOADER
|
|
extern "C" {
|
|
|
|
extern u32 __stack_chk_guard;
|
|
|
|
int main(int, char**, char**);
|
|
|
|
// Tell the compiler that this may be called from somewhere else.
|
|
int _entry(int argc, char** argv, char** env);
|
|
|
|
asm(
|
|
".globl _start\n"
|
|
"_start:\n"
|
|
"push $0\n"
|
|
"jmp _entry@plt\n");
|
|
|
|
int _entry(int argc, char** argv, char** env)
|
|
{
|
|
u32 original_stack_chk = __stack_chk_guard;
|
|
arc4random_buf(&__stack_chk_guard, sizeof(__stack_chk_guard));
|
|
|
|
if (__stack_chk_guard == 0)
|
|
__stack_chk_guard = original_stack_chk;
|
|
|
|
environ = env;
|
|
__environ_is_malloced = false;
|
|
|
|
_init();
|
|
|
|
int status = main(argc, argv, environ);
|
|
|
|
exit(status);
|
|
|
|
// We should never get here, but if we ever do, make sure to
|
|
// restore the stack guard to the value we entered _start with.
|
|
// Then we won't trigger the stack canary check on the way out.
|
|
__stack_chk_guard = original_stack_chk;
|
|
|
|
return 20150614;
|
|
}
|
|
}
|
|
#endif
|