GCC的__attribute__用法

注册函数

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 ===
相关推荐
FPGA-ADDA12 小时前
第二篇:Xilinx 7系列FPGA详解——从Spartan到Virtex
fpga开发·fpga·sdr·rfsoc
daxi1503 天前
Verilog入门实战——第2讲:核心语法基础(数据类型+赋值语句)
fpga开发·fpga
Eloudy3 天前
NetFPGA 快速入门指南
量子计算·fpga·nvqlink
学习永无止境@3 天前
Vivado FPGA输入时钟约束
开发语言·fpga开发·fpga
Eloudy4 天前
Quartus Prime Lite Edition 25.1 安装备忘
fpga
XINVRY-FPGA4 天前
XC7Z020-2CLG400I Xilinx AMDZynq-7000 FPGA
嵌入式硬件·fpga开发·arm·硬件工程·dsp开发·fpga
Eloudy6 天前
Ubuntu 搭建 Chisel 开发环境备忘
ic·fpga
FPGA-ADDA6 天前
第一篇:软件无线电(SDR)基础与FPGA的角色
fpga开发·fpga·数字电路·dsp·软件无线电
FPGA-ADDA6 天前
高速数据记录仪19EG_4NVME_EXT_V1.2存储板
fpga开发·fpga·高速存储·mpsoc·大容量存储
FPGA小迷弟8 天前
FPGA工业常用接口:FPGA 的 SPI 总线多从机通信设计与时序优化
学习·fpga开发·verilog·fpga·modelsim