diff options
Diffstat (limited to 'libc/sysdeps/linux/nios/crtbegin.c')
-rw-r--r-- | libc/sysdeps/linux/nios/crtbegin.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/nios/crtbegin.c b/libc/sysdeps/linux/nios/crtbegin.c new file mode 100644 index 000000000..c52999027 --- /dev/null +++ b/libc/sysdeps/linux/nios/crtbegin.c @@ -0,0 +1,37 @@ +#include <errno.h> +#include <stdlib.h> +/* +static void (*__CTOR_LIST__[1]) __P((void)) + __attribute__((__unused__)) + __attribute__((section(".ctors"))) = { (void *)0 }; + +static void (*__DTOR_LIST__[1]) __P((void)) + __attribute__((section(".dtors"))) = { (void *)-1 }; +*/ +extern void (*__DTOR_LIST__[]) __P((void)); +static void __do_global_dtors_aux __P((void)); + +static void +__do_global_dtors_aux() +{ + void (**p)(void) = __DTOR_LIST__ + 1; + + while (*p) + (**p++)(); +} + +static void dummy_fini(void) __attribute__((section(".trash"))); + +void +dummy_fini(void) +{ + static void (* volatile call__dtors)(void) = __do_global_dtors_aux; + /* + * Call global destructors. + */ + /* prevent function pointer constant propagation */ + __asm__ __volatile__ (".section .fini"); + (*call__dtors)(); + __asm__ __volatile__ (".section .trash"); + +} |