summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile1
-rw-r--r--src/kernel/kernel.c18
-rw-r--r--src/kernel/kernel.h11
-rw-r--r--src/libc/stdint.h4
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