mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-02-28 10:27:07 +08:00
crt_init: fix hardfault in Keil toolchain when there is no cpp object
If there is no SHT$$INIT_ARRAY, calling $Super$$__cpp_initialize__aeabi_() will fault. At least until Keil5.12 the problem still exists. So we have to initialize the C++ runtime our own.
This commit is contained in:
parent
2475568190
commit
01ab0c1d1e
@ -51,8 +51,26 @@ int cplusplus_system_init(void)
|
|||||||
(*ctors_func)();
|
(*ctors_func)();
|
||||||
}
|
}
|
||||||
#elif defined(__CC_ARM)
|
#elif defined(__CC_ARM)
|
||||||
|
# if 1
|
||||||
|
/* If there is no SHT$$INIT_ARRAY, calling
|
||||||
|
* $Super$$__cpp_initialize__aeabi_() will fault. At least until Keil5.12
|
||||||
|
* the problem still exists. So we have to initialize the C++ runtime our
|
||||||
|
* own. */
|
||||||
|
typedef void PROC();
|
||||||
|
extern const unsigned long SHT$$INIT_ARRAY$$Base[];
|
||||||
|
extern const unsigned long SHT$$INIT_ARRAY$$Limit[];
|
||||||
|
const unsigned long *base = SHT$$INIT_ARRAY$$Base;
|
||||||
|
const unsigned long *lim = SHT$$INIT_ARRAY$$Limit;
|
||||||
|
|
||||||
|
for (; base != lim; base++)
|
||||||
|
{
|
||||||
|
PROC *proc = (PROC*)((const char*)base + *base);
|
||||||
|
(*proc)();
|
||||||
|
}
|
||||||
|
# else
|
||||||
/* call armcc lib to initialize cplusplus */
|
/* call armcc lib to initialize cplusplus */
|
||||||
$Super$$__cpp_initialize__aeabi_();
|
$Super$$__cpp_initialize__aeabi_();
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user