diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile | 1 | ||||
-rw-r--r-- | src/kernel/kernel.c | 18 | ||||
-rw-r--r-- | src/kernel/kernel.h | 11 | ||||
-rw-r--r-- | src/libc/stdint.h | 4 |
4 files changed, 34 insertions, 0 deletions
diff --git a/src/Makefile b/src/Makefile index b4ceff1..3c2849e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -3,6 +3,7 @@ DEFINES = -DOS_ABAOS INCLUDES = -I. -Ilibc -Ihardware -Idrivers -Idrivers/hdi -Idrivers/hdi/ps2 -Idrivers/video -Ikernel -Igui CFLAGS := -std=c99 -m32 -march=i486 -ffreestanding -O0 -g -Werror $(INCLUDES) $(DEFINES) LD := ld +LDFLAGS := -lgcc NASMFLAGS := -f elf32 NASM := nasm OBJCOPY := objcopy diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index a472cde..be5da7c 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -419,4 +419,22 @@ static void print_memory_status( global_context_t *global_context ) } +uintptr_t __stack_chk_guard = STACK_CHK_GUARD; +__attribute__( ( noreturn ) ) +void __stack_chk_fail_local( void ) +{ + kernel_panic( "Stack smashing detected!" ); + + // make gcc happy on noreturn does return + for( ;; ); +} + +__attribute__( ( noreturn ) ) +void __stack_chk_fail( void ) +{ + kernel_panic( "Stack smashing detected!" ); + + // make gcc happy on noreturn does return + for( ;; ); +} diff --git a/src/kernel/kernel.h b/src/kernel/kernel.h index dc23fd6..87733c8 100644 --- a/src/kernel/kernel.h +++ b/src/kernel/kernel.h @@ -1,10 +1,21 @@ #ifndef KERNEL_H #define KERNEL_H +#include "stdint.h" #include "stdio.h" void kernel_main( void ); void kernel_panic( const char *format, ... ); void kernel_halt( void ); +#define STACK_CHK_GUARD 0xe2dee396 + +extern uintptr_t __stack_chk_guard; + +__attribute__( ( noreturn ) ) +void __stack_chk_fail_local( void ); + +__attribute__( ( noreturn ) ) +void __stack_chk_fail( void ); + #endif // KERNEL_H diff --git a/src/libc/stdint.h b/src/libc/stdint.h index e0f35b6..23dc370 100644 --- a/src/libc/stdint.h +++ b/src/libc/stdint.h @@ -10,6 +10,10 @@ typedef unsigned short uint16_t; typedef signed short int16_t; typedef unsigned char uint8_t; typedef signed char int8_t; +typedef uint32_t uintptr_t; +#else +// gcc and clang provide a stdint.h +#include_next <stdint.h> #endif #endif // STDINT_H |