diff options
| author | liruncong <[email protected]> | 2019-01-12 12:05:55 +0800 |
|---|---|---|
| committer | liruncong <[email protected]> | 2019-03-10 10:55:22 +0800 |
| commit | d0239b43a0ac1ce04d7a81b305dd6df9cbf81212 (patch) | |
| tree | 138dfd4bafd7476d12785556e90f014f224bd486 /components | |
| parent | e5522d6292e704f0d69cd632a5598b1401732aa9 (diff) | |
[components/cplusplus]修正cplusplus_system_init在arm V6下的问题
Diffstat (limited to 'components')
| -rwxr-xr-x | components/cplusplus/crt_init.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/components/cplusplus/crt_init.c b/components/cplusplus/crt_init.c index e67939feeb..3294b51a40 100755 --- a/components/cplusplus/crt_init.c +++ b/components/cplusplus/crt_init.c @@ -13,10 +13,10 @@ #include <rtthread.h> -#ifdef __CC_ARM +#if defined(__CC_ARM) || defined(__CLANG_ARM) extern void $Super$$__cpp_initialize__aeabi_(void); /* we need to change the cpp_initialize order */ -void $Sub$$__cpp_initialize__aeabi_(void) +RT_WEAK void $Sub$$__cpp_initialize__aeabi_(void) { /* empty */ } @@ -34,19 +34,9 @@ RT_WEAK void *__dso_handle = 0; #endif -RT_WEAK -int cplusplus_system_init(void) +RT_WEAK int cplusplus_system_init(void) { -#if defined(__GNUC__) && !defined(__CC_ARM) - typedef void (*pfunc) (); - extern pfunc __ctors_start__[]; - extern pfunc __ctors_end__[]; - pfunc *p; - - for (p = __ctors_start__; p < __ctors_end__; p++) - (*p)(); - -#elif defined(__CC_ARM) +#if defined(__CC_ARM) || defined(__CLANG_ARM) /* If there is no SHT$$INIT_ARRAY, calling * $Super$$__cpp_initialize__aeabi_() will cause fault. At least until Keil5.12 * the problem still exists. So we have to initialize the C++ runtime by ourself. @@ -63,9 +53,16 @@ int cplusplus_system_init(void) PROC *proc = (PROC*)((const char*)base + *base); (*proc)(); } +#elif defined(__GNUC__) + typedef void(*pfunc) (); + extern pfunc __ctors_start__[]; + extern pfunc __ctors_end__[]; + pfunc *p; + + for (p = __ctors_start__; p < __ctors_end__; p++) + (*p)(); #endif return 0; } INIT_COMPONENT_EXPORT(cplusplus_system_init); - |
