注册函数
c
#include <stdio.h>
typedef int (*initcall_t)(void);
// 宏:注册函数到 myinit 段
#define USER_INITCALL(fn) \
static initcall_t __initcall_##fn __attribute__((used, section("myinit"))) = fn;
// 函数注册
int init_func1(void) {
printf("Init function 1 called\n");
return 0;
}
USER_INITCALL(init_func1)
int init_func2(void) {
printf("Init function 2 called\n");
return 0;
}
USER_INITCALL(init_func2)
int init_func3(void) {
printf("Init function 3 called\n");
return 0;
}
USER_INITCALL(init_func3)
// GCC 会生成段符号
extern initcall_t __start_myinit[];
extern initcall_t __stop_myinit[];
int main() {
printf("=== User initcall demo ===\n");
for (initcall_t *p = __start_myinit; p < __stop_myinit; p++) {
(*p)();
}
printf("=== All init functions called ===\n");
return 0;
}
bash
$ gcc -o user_initcall user_initcall.c
$ ./user_initcall
=== User initcall demo ===
Init function 1 called
Init function 2 called
Init function 3 called
=== All init functions called ===