diff --git a/tools/tcc/Makefile b/tools/tcc/Makefile index 8d0e1c42b14d540052dbabc5cf65568d85af85e3..ff5ba13afabebfbe339e938a2463f1f1debc5448 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 67ddf62e064ebb914eb96ce51438a1a4b61ab03c..21f83d22f2d6cf991538ccb3d7d0844917805560 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 67b09f7a948f19b0147e8a5e2b36d9e45c55c946..6d252efb5081fc8e81151fbdc7fb948cd531b03e 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 624378c27e5eb8098f589b769c5a1016cbe81a37..8d2e21c152842cc4adc40407eac7b4e952949c3a 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 ccc6757dbf9123a2de5eaabcaf3129e9f6d038dd..10098a0c397371448345c426e4ecbc2bf54969d4 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;