From d73ffab4361158e6ca29584da9324771471813e2 Mon Sep 17 00:00:00 2001 From: hinus Date: Thu, 19 Aug 2021 02:22:16 +0800 Subject: [PATCH] Title: A real shell. Issue: https://gitee.com/hinus/linux_kernel_011/issues/I469BL https://gitee.com/hinus/linux_kernel_011/issues/I46998 Description: a better shell. LTT: /et --- tools/tcc/Makefile | 4 ++-- tools/tcc/include/unistd.h | 2 ++ tools/tcc/runtime/{write.c => sys_call.c} | 4 ++++ tools/tcc/tcc | 2 +- tools/tcc/test/test.c | 26 ++++++++++++++--------- 5 files changed, 25 insertions(+), 13 deletions(-) rename tools/tcc/runtime/{write.c => sys_call.c} (37%) diff --git a/tools/tcc/Makefile b/tools/tcc/Makefile index 8d0e1c4..ff5ba13 100644 --- a/tools/tcc/Makefile +++ b/tools/tcc/Makefile @@ -1,13 +1,13 @@ AR := ar GCC := gcc CCFLAG := -m32 -I./include -ffreestanding -fno-pic -Wall -fomit-frame-pointer -fno-stack-protector -c -OBJS := write.o errno.o printf.o vsprintf.o string.o crt0.o +OBJS := sys_call.o errno.o printf.o vsprintf.o string.o crt0.o libc.a: $(OBJS) $(AR) rcs $@ $^ sync -write.o: runtime/write.c +sys_call.o: runtime/sys_call.c $(GCC) $(CCFLAG) -o $@ $< errno.o: runtime/errno.c diff --git a/tools/tcc/include/unistd.h b/tools/tcc/include/unistd.h index 67ddf62..21f83d2 100644 --- a/tools/tcc/include/unistd.h +++ b/tools/tcc/include/unistd.h @@ -150,5 +150,7 @@ __asm__ volatile("int $0x80\n\r"\ extern int errno; int write(int fildes, const char * buf, off_t count); +int read(int fildes, const char * buf, off_t count); +int rmdir(const char* pathname); #endif diff --git a/tools/tcc/runtime/write.c b/tools/tcc/runtime/sys_call.c similarity index 37% rename from tools/tcc/runtime/write.c rename to tools/tcc/runtime/sys_call.c index 67b09f7..6d252ef 100644 --- a/tools/tcc/runtime/write.c +++ b/tools/tcc/runtime/sys_call.c @@ -3,3 +3,7 @@ _syscall3(int,write,int,fd,const char *,buf,off_t,count) _syscall1(int,exit,int,fd); +_syscall3(int,read,int,fd,const char *,buf,off_t,count) +_syscall2(int, mkdir, const char *, pathname, mode_t, mode) +_syscall1(int, rmdir, const char *, pathname) +_syscall1(int, chdir, const char *, filename) diff --git a/tools/tcc/tcc b/tools/tcc/tcc index 624378c..8d2e21c 100755 --- a/tools/tcc/tcc +++ b/tools/tcc/tcc @@ -4,4 +4,4 @@ filename=$1 objfile=${filename/".c"/".o"} echo ${filename/".c"/".o"} gcc -c -fno-pic -m32 -ffreestanding -I./include -o $objfile $filename -ld -M -T linkerscript/a.out.lds linkerscript/a.out.header $objfile libc.a -o $2 > test.map +ld -e _start -M -T linkerscript/a.out.lds linkerscript/a.out.header $objfile libc.a -o $2 > test.map diff --git a/tools/tcc/test/test.c b/tools/tcc/test/test.c index ccc6757..10098a0 100644 --- a/tools/tcc/test/test.c +++ b/tools/tcc/test/test.c @@ -1,17 +1,23 @@ #include +#include +#include +#define MAX_LEN 128 + +char buf[MAX_LEN]; int main(int argc, char** argv, char** envp) { - printf("argc is %d\n", argc); - printf("argv:\n"); - while (*argv) { - printf("%s\n", *argv); - argv++; - } + int i; - printf("envp:\n"); - while (*envp) { - printf("%s\n", *envp); - envp++; + while (1) { + printf(">>>"); + i = read(0, buf, MAX_LEN); + buf[i-1] = '\0'; + if (strcmp(buf, "exit") == 0) { + break; + } + else { + printf("%s\n", buf); + } } return 0; -- Gitee