diff --git a/components/libc/compilers/armlibc/syscalls.c b/components/libc/compilers/armlibc/syscalls.c index 1e08ca1716..37f296fc3a 100644 --- a/components/libc/compilers/armlibc/syscalls.c +++ b/components/libc/compilers/armlibc/syscalls.c @@ -258,23 +258,9 @@ void _ttywrch(int ch) RT_WEAK void _sys_exit(int return_code) { - rt_thread_t self = rt_thread_self(); - -#ifdef RT_USING_MODULE - if (dlmodule_self()) - { - dlmodule_exit(return_code); - } -#endif - - if (self != RT_NULL) - { - rt_kprintf("thread:%-8.*s exit:%d!\n", RT_NAME_MAX, self->name, return_code); - rt_thread_suspend(self); - rt_schedule(); - } - - while(1); /* noreturn */ + extern void __rt_libc_exit(int status); + __rt_libc_exit(return_code); + while(1); } /** @@ -320,8 +306,8 @@ int remove(const char *filename) #else int system(const char *string) { - RT_ASSERT(0); - for (;;); + extern int __rt_libc_system(const char *string); + return __rt_libc_system(string); } #endif diff --git a/components/libc/compilers/common/SConscript b/components/libc/compilers/common/SConscript index 8877f07f24..ecdee2637e 100644 --- a/components/libc/compilers/common/SConscript +++ b/components/libc/compilers/common/SConscript @@ -8,13 +8,13 @@ group = [] CPPPATH = [cwd] if GetDepend('RT_USING_LIBC'): - src += Glob('*.c') + src += Glob('*.c') else: - if GetDepend('RT_LIBC_USING_TIME') and not GetDepend('RT_USING_MINILIBC'): - src += ['time.c'] + if GetDepend('RT_LIBC_USING_TIME') and not GetDepend('RT_USING_MINILIBC'): + src += ['time.c'] if GetDepend('RT_USING_POSIX') == False: - SrcRemove(src, ['unistd.c']) + SrcRemove(src, ['unistd.c']) if rtconfig.CROSS_TOOL == 'keil': CPPDEFINES = ['__CLK_TCK=RT_TICK_PER_SECOND'] diff --git a/components/libc/compilers/common/stdlib.c b/components/libc/compilers/common/stdlib.c new file mode 100644 index 0000000000..b485bbd836 --- /dev/null +++ b/components/libc/compilers/common/stdlib.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-02-15 Meco Man first version + */ + +#include +#include + +void __rt_libc_exit(int status) +{ + rt_thread_t self = rt_thread_self(); + +#ifdef RT_USING_MODULE + if (dlmodule_self()) + { + dlmodule_exit(status); + } +#endif + + if (self != RT_NULL) + { + if(status == EXIT_FAILURE) /* abort() */ + { + rt_kprintf("thread:%s abort!\n", self->name); + } + else /* exit() */ + { + rt_kprintf("thread:%s exit:%d!\n", self->name, status); + } + rt_thread_suspend(self); + rt_schedule(); + } +} + +void __rt_libc_abort(void) +{ + __rt_libc_exit(EXIT_FAILURE); +} + +int __rt_libc_system(const char *string) +{ + /* TODO */ + return 0; +} diff --git a/components/libc/compilers/dlib/syscalls.c b/components/libc/compilers/dlib/syscalls.c index 0d5f02f952..10155948ba 100644 --- a/components/libc/compilers/dlib/syscalls.c +++ b/components/libc/compilers/dlib/syscalls.c @@ -11,42 +11,14 @@ void exit (int status) { - rt_thread_t self = rt_thread_self(); - -#ifdef RT_USING_MODULE - if (dlmodule_self()) - { - dlmodule_exit(status); - } -#endif - - if (self != RT_NULL) - { - rt_kprintf("thread:%-8.*s exit:%d!\n", RT_NAME_MAX, self->name, status); - rt_thread_suspend(self); - rt_schedule(); - } - - while(1); /* noreturn */ + extern void __rt_libc_exit(int status); + __rt_libc_exit(status); + while(1); } void abort(void) { - rt_thread_t self = rt_thread_self(); - -#ifdef RT_USING_MODULE - if (dlmodule_self()) - { - dlmodule_exit(-1); - } -#endif - - if (self != RT_NULL) - { - rt_kprintf("thread:%-8.*s abort!\n", RT_NAME_MAX, self->name); - rt_thread_suspend(self); - rt_schedule(); - } - - while(1); /* noreturn */ + extern void __rt_libc_abort(void); + __rt_libc_abort(); + while(1); } diff --git a/components/libc/compilers/newlib/syscalls.c b/components/libc/compilers/newlib/syscalls.c index cf98e0c3ec..76300f76b2 100644 --- a/components/libc/compilers/newlib/syscalls.c +++ b/components/libc/compilers/newlib/syscalls.c @@ -286,30 +286,16 @@ _free_r (struct _reent *ptr, void *addr) void exit (int status) { - rt_thread_t self = rt_thread_self(); - -#ifdef RT_USING_MODULE - if (dlmodule_self()) - { - dlmodule_exit(status); - } -#endif - - if (self != RT_NULL) - { - rt_kprintf("thread:%-8.*s exit:%d!\n", RT_NAME_MAX, self->name, status); - rt_thread_suspend(self); - rt_schedule(); - } - - while(1); /* noreturn */ + extern void __rt_libc_exit(int status); + __rt_libc_exit(status); + while(1); } void _system(const char *s) { - /* not support this call */ - return; + extern int __rt_libc_system(const char *string); + __rt_libc_system(s); } void __libc_init_array(void) @@ -319,23 +305,9 @@ void __libc_init_array(void) void abort(void) { - rt_thread_t self = rt_thread_self(); - -#ifdef RT_USING_MODULE - if (dlmodule_self()) - { - dlmodule_exit(-1); - } -#endif - - if (self != RT_NULL) - { - rt_kprintf("thread:%-8.*s abort!\n", RT_NAME_MAX, self->name); - rt_thread_suspend(self); - rt_schedule(); - } - - while(1); /* noreturn */ + extern void __rt_libc_abort(void); + __rt_libc_abort(); + while(1); } uid_t getuid(void)