Эх сурвалжийг харах

:new: libc新增_start函数,实现main的返回值的捕获

fslongjin 2 жил өмнө
parent
commit
d7d449bddd

+ 4 - 3
user/apps/about/about.c

@@ -25,7 +25,8 @@ int main()
     // printf("Hello World!\n");
     print_ascii_logo();
     print_copyright();
-    exit(0);
-    while (1)
-        ;
+    // exit(0);
+    // while (1)
+    //     ;
+    return 0;
 }

+ 1 - 1
user/apps/about/about.lds

@@ -1,7 +1,7 @@
 
 OUTPUT_FORMAT("elf64-x86-64","elf64-x86-64","elf64-x86-64")
 OUTPUT_ARCH(i386:x86-64)
-ENTRY(main)
+ENTRY(_start)
 
 SECTIONS
 {

+ 4 - 0
user/libs/libc/Makefile

@@ -4,6 +4,10 @@ CFLAGS += -I .
 
 libc_sub_dirs=math sys
 
+ifeq ($(ARCH), __x86_64__)
+libc_sub_dirs += sysdeps/x86_64
+endif
+
 
 libc: unistd.o fcntl.o malloc.o errno.o printf.o stdlib.o ctype.o string.o dirent.o
 	@list='$(libc_sub_dirs)'; for subdir in $$list; do \

+ 12 - 0
user/libs/libc/sysdeps/x86_64/Makefile

@@ -0,0 +1,12 @@
+
+
+all: start.o
+
+ifeq ($(ARCH), __x86_64__)
+start.o:
+	gcc $(CFLAGS) -c elf/start.c -o elf/start.o
+endif
+
+clean:
+	
+	echo "Done."

+ 10 - 0
user/libs/libc/sysdeps/x86_64/elf/start.c

@@ -0,0 +1,10 @@
+
+extern int main(int, char**);
+#include<libc/stdio.h>
+void _start(int argc, char** argv)
+{
+    printf("before main\n");
+    int retval = main(argc, argv);
+    printf("before exit, code=%d\n", retval);
+    exit(retval);
+}