使用__attribute__((section(“name”)))构建初始化函数表

   需要做三件事:

  • 使用__attribute__((section()))定义了宏:DECLARE_INIT,此宏把函数放置到初始化函数表
  • 使用DELCARE_INIT的宏,声明了3个模块初始化函数:A_init/B_init/C_init
  • 在main中通过调用do_initcalls函数,依次调用编译时构建的初始化函数。其中,“_init_start”和“_init_end”的变量在链接脚本中定义。
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>

typedef void (*init_call)(void);

/*
 * These two variables are defined in link script.
 */

extern init_call _init_start;
extern init_call _init_end;

#define _init __attribute__((unused, section(".myinit")))
#define DECLARE_INIT(func) init_call _fn_##func _init = func

static void A_init(void)
{
    write(1, "A_init\n", sizeof("A_init\n"));
}
DECLARE_INIT(A_init);

static void B_init(void)
{
    printf("B_init\n");

}
DECLARE_INIT(B_init);

static void C_init(void)
{
    printf("C_init\n");
}

DECLARE_INIT(C_init);
/*
 * DECLARE_INIT like below:
 *  static init_call _fn_A_init __attribute__((unused, section(".myinit"))) = A_init;
 *  static init_call _fn_C_init __attribute__((unused, section(".myinit"))) = C_init;
 *  static init_call _fn_B_init __attribute__((unused, section(".myinit"))) = B_init;
 */

void do_initcalls(void)
{
    init_call *init_ptr = &_init_start;
    for (; init_ptr < &_init_end; init_ptr++)
    {
        printf("init address: %p\n", init_ptr);
        (*init_ptr)();
    }
}

int main(void)
{
    do_initcalls();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值