diff options
Diffstat (limited to 'libc/sysdeps/linux/nios/crtend.c')
-rw-r--r-- | libc/sysdeps/linux/nios/crtend.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/nios/crtend.c b/libc/sysdeps/linux/nios/crtend.c new file mode 100644 index 000000000..26af229af --- /dev/null +++ b/libc/sysdeps/linux/nios/crtend.c @@ -0,0 +1,43 @@ +#include <errno.h> +#include <stdlib.h> +/* +static void (*__CTOR_END__[1]) __P((void)) + __attribute__((section(".ctors"))) = { (void *)-1 }; + +static void (*__DTOR_END__[1]) __P((void)) + __attribute__((__unused__)) + __attribute__((section(".dtors"))) = { (void *)0 }; +*/ +extern void (*__CTOR_END__[]) __P((void)); +static void __do_global_ctors_aux __P((void)); + +static void +__do_global_ctors_aux() +{ + void (**p)(void) = __CTOR_END__ - 1; + + while (*p) + (**p--)(); +} + +static void dummy_init(void) __attribute__((section(".trash"))); + +void +dummy_init(void) +{ + static int initialized = 0; + static void (*volatile call__ctors)(void) = __do_global_ctors_aux; + /* + * Call global constructors. + * Arrange to call global destructors at exit. + */ + /* prevent function pointer constant propagation */ + __asm__ __volatile__ (".section .init"); + + if (!initialized) { + initialized = 1; + (*call__ctors)(); + } + __asm__ __volatile__ (".section .trash"); + +}
\ No newline at end of file |