From 168d967743a2c039d6a49ba582ba286b2e14d977 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sun, 4 Jan 2015 14:59:48 +0000 Subject: [PATCH] __libc_init_array needs run after stack adjustment, __libc_fini_array before original stack is restored --- libctru/source/system/ctru_exit.c | 3 --- libctru/source/system/initSystem.c | 5 ----- libctru/source/system/stack_adjust.s | 6 +++++- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/libctru/source/system/ctru_exit.c b/libctru/source/system/ctru_exit.c index f4c99f1..6cd4a38 100644 --- a/libctru/source/system/ctru_exit.c +++ b/libctru/source/system/ctru_exit.c @@ -15,9 +15,6 @@ void __attribute__((weak)) __attribute__((noreturn)) __libctru_exit(int rc) { u32 tmp=0; - // Run the global destructors - __libc_fini_array(); - __appExit(); // Unmap the linear heap diff --git a/libctru/source/system/initSystem.c b/libctru/source/system/initSystem.c index 501cfaa..c14c455 100644 --- a/libctru/source/system/initSystem.c +++ b/libctru/source/system/initSystem.c @@ -12,9 +12,6 @@ void __system_allocateHeaps(); void __system_initArgv(); void __appInit(); -// newlib definitions we need -void __libc_init_array(void); - void __ctru_exit(int rc); @@ -32,6 +29,4 @@ void __attribute__((weak)) __libctru_init(void (*retAddr)(void)) __appInit(); - // Run the global constructors - __libc_init_array(); } diff --git a/libctru/source/system/stack_adjust.s b/libctru/source/system/stack_adjust.s index 7c780fb..03513f0 100644 --- a/libctru/source/system/stack_adjust.s +++ b/libctru/source/system/stack_adjust.s @@ -16,12 +16,14 @@ initSystem: ldr sp, [r2] ldr r3, =__stacksize__ - ldr r3, [r3] + ldr r3, [r3] add sp, sp, r3 add sp, sp, #7 bics sp, sp, #7 str sp, [r2] + bl __libc_init_array + ldr r2, =saved_stack ldr lr, [r2,#4] bx lr @@ -31,6 +33,8 @@ initSystem: .type __ctru_exit, %function __ctru_exit: + bl __libc_fini_array + ldr r2, =saved_stack ldr sp, [r2] b __libctru_exit