diff --git a/libctru/source/system/allocateHeaps.c b/libctru/source/system/allocateHeaps.c index 4009f8e..d53625c 100644 --- a/libctru/source/system/allocateHeaps.c +++ b/libctru/source/system/allocateHeaps.c @@ -7,6 +7,7 @@ u32 __linear_heap; u32 __heapBase; extern u32 __heap_size, __linear_heap_size; +u32 __attribute__((weak)) __stacksize__ = 32 * 1024; void __attribute__((weak)) __system_allocateHeaps() { u32 tmp=0; @@ -18,7 +19,7 @@ void __attribute__((weak)) __system_allocateHeaps() { // Allocate the linear heap svcControlMemory(&__linear_heap, 0x0, 0x0, __linear_heap_size, MEMOP_ALLOC_LINEAR, 0x3); // Set up newlib heap - fake_heap_start = (char*)__heapBase; - fake_heap_end = fake_heap_start + __heap_size; + fake_heap_start = (char*)__heapBase + __stacksize__; + fake_heap_end = fake_heap_start + __heap_size - __stacksize__; -} \ No newline at end of file +} diff --git a/libctru/source/system/ctru_exit.c b/libctru/source/system/ctru_exit.c index 058ea7c..f4c99f1 100644 --- a/libctru/source/system/ctru_exit.c +++ b/libctru/source/system/ctru_exit.c @@ -11,7 +11,7 @@ void __appExit(); void __libc_fini_array(void); -void __attribute__((weak)) __attribute__((noreturn)) __ctru_exit(int rc) +void __attribute__((weak)) __attribute__((noreturn)) __libctru_exit(int rc) { u32 tmp=0; diff --git a/libctru/source/system/initSystem.c b/libctru/source/system/initSystem.c index 080d125..47b1067 100644 --- a/libctru/source/system/initSystem.c +++ b/libctru/source/system/initSystem.c @@ -18,7 +18,7 @@ void __libc_init_array(void); void __ctru_exit(int rc); -void __attribute__((weak)) initSystem(void (*retAddr)(void)) +void __attribute__((weak)) __ctru_initSystem(void (*retAddr)(void)) { // Register newlib exit() syscall diff --git a/libctru/source/system/init_exit_Wrappers.s b/libctru/source/system/init_exit_Wrappers.s new file mode 100644 index 0000000..6155b64 --- /dev/null +++ b/libctru/source/system/init_exit_Wrappers.s @@ -0,0 +1,30 @@ + .text + .arm + .cpu mpcore + + .global initSystem + .type initSystem STT_FUNC +@--------------------------------------------------------------------------------- +initSystem: +@--------------------------------------------------------------------------------- + adr r0, saved_lr + str lr, [r0] + str sp, [r0,#4] + bl __ctru_initSystem + ldr r0,=fake_heap_start + ldr sp, [r0] + ldr pc, saved_lr + +saved_lr: + .word 0 +saved_stack: + .word 0 + + + .global __ctru_exit + .type __ctru_exit STT_FUNC +@--------------------------------------------------------------------------------- +__ctru_exit: +@--------------------------------------------------------------------------------- + ldr sp, saved_stack + b __libctru_exit