68 lines
1.8 KiB
C
68 lines
1.8 KiB
C
![]() |
#include <sys/types.h>
|
||
|
|
||
|
#define USE_LIBC_INITFINI 0
|
||
|
|
||
|
#if USE_LIBC_INITFINI
|
||
|
|
||
|
/*
|
||
|
* The _init() and _fini() will be called respectively when use __libc_init_array()
|
||
|
* and __libc_fnit_array() in libc.a to perform constructor and destructor handling.
|
||
|
* The dummy versions of these functions should be provided.
|
||
|
*/
|
||
|
#if 1
|
||
|
void _init(void)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void _fini(void)
|
||
|
{
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#else
|
||
|
|
||
|
/* 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));
|
||
|
|
||
|
/*
|
||
|
* The __libc_init_array()/__libc_fnit_array() function is used to do global
|
||
|
* constructor/destructor and can NOT be compilied to generate the code coverage
|
||
|
* data. We have the function attribute to be 'no_profile_instrument_function'
|
||
|
* to prevent been instrumented for coverage analysis when GCOV=1 is applied.
|
||
|
*/
|
||
|
/* Iterate over all the init routines. */
|
||
|
//void __libc_init_array (void) __attribute__((no_profile_instrument_function));
|
||
|
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] ();
|
||
|
|
||
|
count = __init_array_end - __init_array_start;
|
||
|
for (i = 0; i < count; i++)
|
||
|
__init_array_start[i] ();
|
||
|
}
|
||
|
|
||
|
extern void (*__fini_array_start []) (void) __attribute__((weak));
|
||
|
extern void (*__fini_array_end []) (void) __attribute__((weak));
|
||
|
|
||
|
/* Run all the cleanup routines. */
|
||
|
void __libc_fini_array (void) __attribute__((no_profile_instrument_function));
|
||
|
void __libc_fini_array (void)
|
||
|
{
|
||
|
size_t count;
|
||
|
size_t i;
|
||
|
|
||
|
count = __fini_array_end - __fini_array_start;
|
||
|
for (i = count; i > 0; i--)
|
||
|
__fini_array_start[i-1] ();
|
||
|
}
|
||
|
|
||
|
#endif
|