#include #ifdef __APPLE__ extern char __start_initcall0[] __asm("section$start$__DATA$__initcall0.init"); extern char __stop_initcall0[] __asm("section$end$__DATA$__initcall0.init"); extern char __start_initcall1[] __asm("section$start$__DATA$__initcall1.init"); extern char __stop_initcall1[] __asm("section$end$__DATA$__initcall1.init"); extern char __start_initcall2[] __asm("section$start$__DATA$__initcall2.init"); extern char __stop_initcall2[] __asm("section$end$__DATA$__initcall2.init"); extern char __start_initcall3[] __asm("section$start$__DATA$__initcall3.init"); extern char __stop_initcall3[] __asm("section$end$__DATA$__initcall3.init"); extern char __start_initcall4[] __asm("section$start$__DATA$__initcall4.init"); extern char __stop_initcall4[] __asm("section$end$__DATA$__initcall4.init"); extern char __start_initcall5[] __asm("section$start$__DATA$__initcall5.init"); extern char __stop_initcall5[] __asm("section$end$__DATA$__initcall5.init"); extern char __start_initcall6[] __asm("section$start$__DATA$__initcall6.init"); extern char __stop_initcall6[] __asm("section$end$__DATA$__initcall6.init"); extern char __start_initcall7[] __asm("section$start$__DATA$__initcall7.init"); extern char __stop_initcall7[] __asm("section$end$__DATA$__initcall7.init"); extern char __start_initcall8[] __asm("section$start$__DATA$__initcall8.init"); extern char __stop_initcall8[] __asm("section$end$__DATA$__initcall8.init"); #else extern char __start_initcall0_init[]; extern char __stop_initcall0_init[]; extern char __start_initcall1_init[]; extern char __stop_initcall1_init[]; extern char __start_initcall2_init[]; extern char __stop_initcall2_init[]; extern char __start_initcall3_init[]; extern char __stop_initcall3_init[]; extern char __start_initcall4_init[]; extern char __stop_initcall4_init[]; extern char __start_initcall5_init[]; extern char __stop_initcall5_init[]; extern char __start_initcall6_init[]; extern char __stop_initcall6_init[]; extern char __start_initcall7_init[]; extern char __stop_initcall7_init[]; extern char __start_initcall8_init[]; extern char __stop_initcall8_init[]; #endif static initcall_t *initcall_start[] = { (initcall_t *)__start_initcall0_init, (initcall_t *)__start_initcall1_init, (initcall_t *)__start_initcall2_init, (initcall_t *)__start_initcall3_init, (initcall_t *)__start_initcall4_init, (initcall_t *)__start_initcall5_init, (initcall_t *)__start_initcall6_init, (initcall_t *)__start_initcall7_init, (initcall_t *)__start_initcall8_init, }; static initcall_t *initcall_end[] = { (initcall_t *)__stop_initcall0_init, (initcall_t *)__stop_initcall1_init, (initcall_t *)__stop_initcall2_init, (initcall_t *)__stop_initcall3_init, (initcall_t *)__stop_initcall4_init, (initcall_t *)__stop_initcall5_init, (initcall_t *)__stop_initcall6_init, (initcall_t *)__stop_initcall7_init, (initcall_t *)__stop_initcall8_init, }; int start_initlevel(int level) { if (initcall_start[level] == initcall_end[level]) { return 0; } for (initcall_t *fn = initcall_start[level]; fn < initcall_end[level]; fn++) { int res = (*fn)(); if (res != 0) { return res; } } return 0; } /* define a stub initcall for each initlevel to ensure the corresponding exec section gets created */ static int stub_initcall(void) { return 0; } __define_initcall(stub_initcall, 0); __define_initcall(stub_initcall, 1); __define_initcall(stub_initcall, 2); __define_initcall(stub_initcall, 3); __define_initcall(stub_initcall, 4); __define_initcall(stub_initcall, 5); __define_initcall(stub_initcall, 6); __define_initcall(stub_initcall, 7); __define_initcall(stub_initcall, 8);