소스 검색

feat: call c++ objects' constructors

greatbridf 3 년 전
부모
커밋
cb4d47c312
3개의 변경된 파일22개의 추가작업 그리고 1개의 파일을 삭제
  1. 1 1
      CMakeLists.txt
  2. 5 0
      ldscript.ld
  3. 16 0
      src/kernel_main.c

+ 1 - 1
CMakeLists.txt

@@ -24,7 +24,7 @@ add_custom_command(OUTPUT extracted_bootloader
 project(kernel_main)
 
 set(CMAKE_C_FLAGS "-nostdinc -m32 -nostdlib -Wall -Wextra -fverbose-asm -fno-exceptions -fno-pic -fno-stack-protector")
-set(CMAKE_CXX_FLAGS "-nostdinc -m32 -nostdlib -Wall -Wextra -fverbose-asm -fno-exceptions -fno-pic -fno-stack-protector")
+set(CMAKE_CXX_FLAGS "-nostdinc -m32 -nostdlib -Wall -Wextra -fverbose-asm -fno-use-cxa-atexit -fno-exceptions -fno-pic -fno-stack-protector")
 
 if (CMAKE_BUILD_TYPE STREQUAL "Debug")
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g")

+ 5 - 0
ldscript.ld

@@ -28,6 +28,11 @@ SECTIONS
 
     .data :
     {
+        start_ctors = .;
+        KEEP(*(.init_array));
+        KEEP(*(SORT_BY_INIT_PRIORITY(.init_array*)));
+        end_ctors = .;
+
         *(.data)
         *(.data*)
     } > WHOLE

+ 16 - 0
src/kernel_main.c

@@ -8,6 +8,16 @@
 #include <kernel/stdio.h>
 #include <kernel/vga.h>
 
+typedef void (*constructor)(void);
+extern constructor start_ctors;
+extern constructor end_ctors;
+void call_constructors_for_cpp(void)
+{
+    for (constructor* ctor = &start_ctors; ctor != &end_ctors; ++ctor) {
+        (*ctor)();
+    }
+}
+
 void kernel_main(void)
 {
     MAKE_BREAK_POINT();
@@ -42,6 +52,12 @@ void kernel_main(void)
 
     vga_printk("Heap space initialized!\n", 0x0fu);
 
+    vga_printk("Constructing c++ global objects\n", 0x0fu);
+
+    call_constructors_for_cpp();
+
+    vga_printk("Cpp global objects constructed\n", 0x0fu);
+
     vga_printk("Testing k_malloc...\n", 0x0fu);
     char* k_malloc_buf = (char*)k_malloc(sizeof(char) * 128);
     snprintf(k_malloc_buf, 128, "This text is printed on the heap!\n");