From d7d449bdddbdf2570d13398e13212735e9abc8e8 Mon Sep 17 00:00:00 2001 From: fslongjin Date: Sat, 25 Jun 2022 00:51:29 +0800 Subject: [PATCH] =?UTF-8?q?:new:=20libc=E6=96=B0=E5=A2=9E=5Fstart=E5=87=BD?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E5=AE=9E=E7=8E=B0main=E7=9A=84=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=80=BC=E7=9A=84=E6=8D=95=E8=8E=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- user/apps/about/about.c | 7 ++++--- user/apps/about/about.lds | 2 +- user/libs/libc/Makefile | 4 ++++ user/libs/libc/sysdeps/x86_64/Makefile | 12 ++++++++++++ user/libs/libc/sysdeps/x86_64/elf/start.c | 10 ++++++++++ 5 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 user/libs/libc/sysdeps/x86_64/Makefile create mode 100644 user/libs/libc/sysdeps/x86_64/elf/start.c diff --git a/user/apps/about/about.c b/user/apps/about/about.c index c4dc2ca2..be2e1609 100644 --- a/user/apps/about/about.c +++ b/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; } \ No newline at end of file diff --git a/user/apps/about/about.lds b/user/apps/about/about.lds index 0074c8a2..c9f7f159 100644 --- a/user/apps/about/about.lds +++ b/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 { diff --git a/user/libs/libc/Makefile b/user/libs/libc/Makefile index 1b7b1541..d56b6314 100644 --- a/user/libs/libc/Makefile +++ b/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 \ diff --git a/user/libs/libc/sysdeps/x86_64/Makefile b/user/libs/libc/sysdeps/x86_64/Makefile new file mode 100644 index 00000000..a66a3ef6 --- /dev/null +++ b/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." \ No newline at end of file diff --git a/user/libs/libc/sysdeps/x86_64/elf/start.c b/user/libs/libc/sysdeps/x86_64/elf/start.c new file mode 100644 index 00000000..c9c270f6 --- /dev/null +++ b/user/libs/libc/sysdeps/x86_64/elf/start.c @@ -0,0 +1,10 @@ + +extern int main(int, char**); +#include +void _start(int argc, char** argv) +{ + printf("before main\n"); + int retval = main(argc, argv); + printf("before exit, code=%d\n", retval); + exit(retval); +} \ No newline at end of file