2005-01-08 02:04:39 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2004 CodeSourcery, LLC
|
|
|
|
*
|
|
|
|
* Permission to use, copy, modify, and distribute this file
|
|
|
|
* for any purpose is hereby granted without fee, provided that
|
|
|
|
* the above copyright notice and this notice appears in all
|
|
|
|
* copies.
|
|
|
|
*
|
|
|
|
* This file is distributed WITHOUT ANY WARRANTY; without even the implied
|
|
|
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Handle ELF .{pre_init,init,fini}_array sections. */
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
|
|
|
#ifdef HAVE_INITFINI_ARRAY
|
|
|
|
|
|
|
|
/* These magic symbols are provided by the linker. */
|
|
|
|
extern void (*__preinit_array_start []) (void) __attribute__((weak));
|
|
|
|
extern void (*__preinit_array_end []) (void) __attribute__((weak));
|
|
|
|
extern void (*__init_array_start []) (void) __attribute__((weak));
|
|
|
|
extern void (*__init_array_end []) (void) __attribute__((weak));
|
|
|
|
extern void (*__fini_array_start []) (void) __attribute__((weak));
|
|
|
|
extern void (*__fini_array_end []) (void) __attribute__((weak));
|
|
|
|
|
|
|
|
extern void _init (void);
|
|
|
|
extern void _fini (void);
|
|
|
|
|
|
|
|
/* Iterate over all the init routines. */
|
|
|
|
void
|
|
|
|
__libc_init_array (void)
|
|
|
|
{
|
|
|
|
size_t count;
|
|
|
|
size_t i;
|
|
|
|
|
|
|
|
count = __preinit_array_end - __preinit_array_start;
|
|
|
|
for (i = 0; i < count; i++)
|
|
|
|
__preinit_array_start[i] ();
|
|
|
|
|
|
|
|
_init ();
|
|
|
|
|
|
|
|
count = __init_array_end - __init_array_start;
|
|
|
|
for (i = 0; i < count; i++)
|
|
|
|
__init_array_start[i] ();
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Run all the cleanup routines. */
|
|
|
|
void
|
|
|
|
__libc_fini_array (void)
|
|
|
|
{
|
|
|
|
size_t count;
|
|
|
|
size_t i;
|
|
|
|
|
|
|
|
count = __fini_array_end - __fini_array_start;
|
2009-04-17 03:16:41 +08:00
|
|
|
for (i = count; i > 0; i--)
|
|
|
|
__fini_array_start[i-1] ();
|
2005-01-08 02:04:39 +08:00
|
|
|
|
|
|
|
_fini ();
|
|
|
|
}
|
|
|
|
#endif
|