#include <sys/cdefs.h>
#ifndef DSO_LIB
#include <atf-c.h>
#endif
#include <crt.h>
typedef void (*func_ptr)(void);
extern volatile int ctors_run;
extern volatile int preinit_array_run;
extern volatile int preinit_array_state;
extern volatile int init_array_run;
extern volatile int init_array_state;
#ifndef DSO_BASE
volatile int ctors_run;
volatile int preinit_array_run;
volatile int preinit_array_state = -1;
volatile int init_array_run;
volatile int init_array_state = -1;
#endif
#ifndef DSO_BASE
static void
ctors_handler(void)
{
ctors_run = 1;
}
__section(".ctors") __used static func_ptr ctors_func =
&ctors_handler;
#endif
#ifndef DSO_LIB
ATF_TC_WITHOUT_HEAD(ctors_test);
ATF_TC_BODY(ctors_test, tc)
{
#ifdef HAVE_CTORS
ATF_REQUIRE_MSG(ctors_run == 1, ".ctors not run");
#else
ATF_REQUIRE_MSG(ctors_run == 0, ".ctors run");
#endif
}
#endif
#if !defined(DSO_BASE) && !defined(DSO_LIB)
static void
preinit_array_handler(void)
{
preinit_array_run = 1;
preinit_array_state = init_array_run;
}
__section(".preinit_array") __used static func_ptr preinit_array_func =
&preinit_array_handler;
#endif
#ifndef DSO_LIB
ATF_TC_WITHOUT_HEAD(preinit_array_test);
ATF_TC_BODY(preinit_array_test, tc)
{
#ifdef DSO_BASE
ATF_REQUIRE_MSG(preinit_array_run == 0, ".preinit_array run in DSO");
#else
ATF_REQUIRE_MSG(preinit_array_run == 1, ".preinit_array not run");
ATF_REQUIRE_MSG(preinit_array_state == 0,
".preinit_array was not run before .init_array");
#endif
}
#endif
#ifndef DSO_BASE
static void
init_array_handler(void)
{
init_array_run = 1;
init_array_state = preinit_array_run;
}
__section(".init_array") __used static func_ptr init_array_func =
&init_array_handler;
#endif
#ifndef DSO_LIB
ATF_TC_WITHOUT_HEAD(init_array_test);
ATF_TC_BODY(init_array_test, tc)
{
ATF_REQUIRE_MSG(init_array_run == 1, ".init_array not run");
#ifndef DSO_BASE
ATF_REQUIRE_MSG(init_array_state == 1,
".init_array was not run after .preinit_array");
#endif
}
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, ctors_test);
ATF_TP_ADD_TC(tp, preinit_array_test);
ATF_TP_ADD_TC(tp, init_array_test);
return (atf_no_error());
}
#endif