From e927a53b41fa58573e14eccac37374d686ad3cf7 Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Wed, 17 Feb 2021 00:02:28 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E7=B2=BE=E7=AE=80exit=20abort=20system?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/libc/compilers/armlibc/syscalls.c | 23 ++------- components/libc/compilers/common/SConscript | 8 +-- components/libc/compilers/common/stdlib.c | 52 ++++++++++++++++++++ components/libc/compilers/dlib/syscalls.c | 38 ++------------ components/libc/compilers/newlib/syscalls.c | 42 +++------------- 5 files changed, 70 insertions(+), 93 deletions(-) create mode 100644 components/libc/compilers/common/stdlib.c diff --git a/components/libc/compilers/armlibc/syscalls.c b/components/libc/compilers/armlibc/syscalls.c index 1e08ca1716..43b655e1a6 100644 --- a/components/libc/compilers/armlibc/syscalls.c +++ b/components/libc/compilers/armlibc/syscalls.c @@ -258,23 +258,8 @@ 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 rt_inline void __exit__(int status); + __exit__(return_code); } /** @@ -320,8 +305,8 @@ int remove(const char *filename) #else int system(const char *string) { - RT_ASSERT(0); - for (;;); + extern rt_inline int __system__(const char *string); + return __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..01f18aca5f --- /dev/null +++ b/components/libc/compilers/common/stdlib.c @@ -0,0 +1,52 @@ +/* + * 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 + +#define ABORT_STATUS 2 + +rt_inline 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) + { + if(status == ABORT_STATUS) /* abort() */ + { + rt_kprintf("thread:%s abort!\n", RT_NAME_MAX, self->name, status); + } + else /* exit() */ + { + rt_kprintf("thread:%s exit:%d!\n", RT_NAME_MAX, self->name, status); + } + rt_thread_suspend(self); + rt_schedule(); + } + + while(1); /* noreturn */ +} + +rt_inline void __abort__(void) +{ + __exit__(ABORT_STATUS); +} + +rt_inline int __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..6f16da2fcb 100644 --- a/components/libc/compilers/dlib/syscalls.c +++ b/components/libc/compilers/dlib/syscalls.c @@ -11,42 +11,12 @@ 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 rt_inline void __exit__(int status); + __exit__(return_code); } 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 rt_inline void __abort__(void); + __abort__(); } diff --git a/components/libc/compilers/newlib/syscalls.c b/components/libc/compilers/newlib/syscalls.c index cf98e0c3ec..7fe02eb0a0 100644 --- a/components/libc/compilers/newlib/syscalls.c +++ b/components/libc/compilers/newlib/syscalls.c @@ -286,30 +286,15 @@ _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 rt_inline void __exit__(int status); + __exit__(status); } void _system(const char *s) { - /* not support this call */ - return; + extern rt_inline int __system__(const char *string); + __system__(string); } void __libc_init_array(void) @@ -319,23 +304,8 @@ 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 rt_inline void __abort__(void); + __abort__(); } uid_t getuid(void) From 9f5878b2fbdf90afb9c92dc40d99b79905b2b158 Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Wed, 17 Feb 2021 00:18:49 +0800 Subject: [PATCH 2/4] update --- components/libc/compilers/armlibc/syscalls.c | 5 +++-- components/libc/compilers/common/stdlib.c | 10 ++++------ components/libc/compilers/dlib/syscalls.c | 8 +++++--- components/libc/compilers/newlib/syscalls.c | 10 ++++++---- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/components/libc/compilers/armlibc/syscalls.c b/components/libc/compilers/armlibc/syscalls.c index 43b655e1a6..eb31a9118a 100644 --- a/components/libc/compilers/armlibc/syscalls.c +++ b/components/libc/compilers/armlibc/syscalls.c @@ -258,8 +258,9 @@ void _ttywrch(int ch) RT_WEAK void _sys_exit(int return_code) { - extern rt_inline void __exit__(int status); + extern void __exit__(int status); __exit__(return_code); + while(1); } /** @@ -305,7 +306,7 @@ int remove(const char *filename) #else int system(const char *string) { - extern rt_inline int __system__(const char *string); + extern int __system__(const char *string); return __system__(string); } #endif diff --git a/components/libc/compilers/common/stdlib.c b/components/libc/compilers/common/stdlib.c index 01f18aca5f..022342aea9 100644 --- a/components/libc/compilers/common/stdlib.c +++ b/components/libc/compilers/common/stdlib.c @@ -12,7 +12,7 @@ #define ABORT_STATUS 2 -rt_inline void __exit__(int status) +void __exit__(int status) { rt_thread_t self = rt_thread_self(); @@ -27,7 +27,7 @@ rt_inline void __exit__(int status) { if(status == ABORT_STATUS) /* abort() */ { - rt_kprintf("thread:%s abort!\n", RT_NAME_MAX, self->name, status); + rt_kprintf("thread:%s abort!\n", RT_NAME_MAX, self->name); } else /* exit() */ { @@ -36,16 +36,14 @@ rt_inline void __exit__(int status) rt_thread_suspend(self); rt_schedule(); } - - while(1); /* noreturn */ } -rt_inline void __abort__(void) +void __abort__(void) { __exit__(ABORT_STATUS); } -rt_inline int __system__(const char *string) +int __system__(const char *string) { /* TODO */ return 0; diff --git a/components/libc/compilers/dlib/syscalls.c b/components/libc/compilers/dlib/syscalls.c index 6f16da2fcb..a185b0104b 100644 --- a/components/libc/compilers/dlib/syscalls.c +++ b/components/libc/compilers/dlib/syscalls.c @@ -11,12 +11,14 @@ void exit (int status) { - extern rt_inline void __exit__(int status); - __exit__(return_code); + extern void __exit__(int status); + __exit__(status); + while(1); } void abort(void) { - extern rt_inline void __abort__(void); + extern void __abort__(void); __abort__(); + while(1); } diff --git a/components/libc/compilers/newlib/syscalls.c b/components/libc/compilers/newlib/syscalls.c index 7fe02eb0a0..6f833f05e4 100644 --- a/components/libc/compilers/newlib/syscalls.c +++ b/components/libc/compilers/newlib/syscalls.c @@ -286,15 +286,16 @@ _free_r (struct _reent *ptr, void *addr) void exit (int status) { - extern rt_inline void __exit__(int status); + extern void __exit__(int status); __exit__(status); + while(1); } void _system(const char *s) { - extern rt_inline int __system__(const char *string); - __system__(string); + extern int __system__(const char *string); + __system__(s); } void __libc_init_array(void) @@ -304,8 +305,9 @@ void __libc_init_array(void) void abort(void) { - extern rt_inline void __abort__(void); + extern void __abort__(void); __abort__(); + while(1); } uid_t getuid(void) From 933c54c668b8a9480a3f03c9ba3437763396a9cc Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Wed, 17 Feb 2021 00:27:24 +0800 Subject: [PATCH 3/4] update --- components/libc/compilers/common/stdlib.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/libc/compilers/common/stdlib.c b/components/libc/compilers/common/stdlib.c index 022342aea9..45a65e9c96 100644 --- a/components/libc/compilers/common/stdlib.c +++ b/components/libc/compilers/common/stdlib.c @@ -10,7 +10,7 @@ #include -#define ABORT_STATUS 2 +#define ABORT_STATUS 1 void __exit__(int status) { @@ -27,11 +27,11 @@ void __exit__(int status) { if(status == ABORT_STATUS) /* abort() */ { - rt_kprintf("thread:%s abort!\n", RT_NAME_MAX, self->name); + rt_kprintf("thread:%s abort!\n", self->name); } else /* exit() */ { - rt_kprintf("thread:%s exit:%d!\n", RT_NAME_MAX, self->name, status); + rt_kprintf("thread:%s exit:%d!\n", self->name, status); } rt_thread_suspend(self); rt_schedule(); From 263d856fa4025a727c0556f7fc286f79450d9932 Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Wed, 17 Feb 2021 23:50:12 +0800 Subject: [PATCH 4/4] update --- components/libc/compilers/armlibc/syscalls.c | 8 ++++---- components/libc/compilers/common/stdlib.c | 13 ++++++------- components/libc/compilers/dlib/syscalls.c | 8 ++++---- components/libc/compilers/newlib/syscalls.c | 12 ++++++------ 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/components/libc/compilers/armlibc/syscalls.c b/components/libc/compilers/armlibc/syscalls.c index eb31a9118a..37f296fc3a 100644 --- a/components/libc/compilers/armlibc/syscalls.c +++ b/components/libc/compilers/armlibc/syscalls.c @@ -258,8 +258,8 @@ void _ttywrch(int ch) RT_WEAK void _sys_exit(int return_code) { - extern void __exit__(int status); - __exit__(return_code); + extern void __rt_libc_exit(int status); + __rt_libc_exit(return_code); while(1); } @@ -306,8 +306,8 @@ int remove(const char *filename) #else int system(const char *string) { - extern int __system__(const char *string); - return __system__(string); + extern int __rt_libc_system(const char *string); + return __rt_libc_system(string); } #endif diff --git a/components/libc/compilers/common/stdlib.c b/components/libc/compilers/common/stdlib.c index 45a65e9c96..b485bbd836 100644 --- a/components/libc/compilers/common/stdlib.c +++ b/components/libc/compilers/common/stdlib.c @@ -9,10 +9,9 @@ */ #include +#include -#define ABORT_STATUS 1 - -void __exit__(int status) +void __rt_libc_exit(int status) { rt_thread_t self = rt_thread_self(); @@ -25,7 +24,7 @@ void __exit__(int status) if (self != RT_NULL) { - if(status == ABORT_STATUS) /* abort() */ + if(status == EXIT_FAILURE) /* abort() */ { rt_kprintf("thread:%s abort!\n", self->name); } @@ -38,12 +37,12 @@ void __exit__(int status) } } -void __abort__(void) +void __rt_libc_abort(void) { - __exit__(ABORT_STATUS); + __rt_libc_exit(EXIT_FAILURE); } -int __system__(const char *string) +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 a185b0104b..10155948ba 100644 --- a/components/libc/compilers/dlib/syscalls.c +++ b/components/libc/compilers/dlib/syscalls.c @@ -11,14 +11,14 @@ void exit (int status) { - extern void __exit__(int status); - __exit__(status); + extern void __rt_libc_exit(int status); + __rt_libc_exit(status); while(1); } void abort(void) { - extern void __abort__(void); - __abort__(); + 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 6f833f05e4..76300f76b2 100644 --- a/components/libc/compilers/newlib/syscalls.c +++ b/components/libc/compilers/newlib/syscalls.c @@ -286,16 +286,16 @@ _free_r (struct _reent *ptr, void *addr) void exit (int status) { - extern void __exit__(int status); - __exit__(status); + extern void __rt_libc_exit(int status); + __rt_libc_exit(status); while(1); } void _system(const char *s) { - extern int __system__(const char *string); - __system__(s); + extern int __rt_libc_system(const char *string); + __rt_libc_system(s); } void __libc_init_array(void) @@ -305,8 +305,8 @@ void __libc_init_array(void) void abort(void) { - extern void __abort__(void); - __abort__(); + extern void __rt_libc_abort(void); + __rt_libc_abort(); while(1); }