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小迷弟2 小时前
FPGA 与卫星:从星载硬件到在轨智能的完整技术解析
fpga开发·架构·fpga·1024程序员节·无线电
LabVIEW开发1 天前
FlexRIO 在轨图像取舍:判决要跑在数据进内存之前
labview·fpga·labview功能·labview程序·flexrio
FPGA小迷弟1 天前
FPGA 与无线电:从软件定义无线电到 5G 基带的硬件实现之路
5g·fpga开发·架构·dsp开发·fpga·无线电
yingheceping1 天前
2026 国产 FPGA 核心板怎么选?工控/视觉/通信/科研,四场景对板指南
fpga开发·fpga
FPGA小徐2 天前
FPGA离散数列信源熵:原理、计算与硬件实现全解
fpga
FPGA小徐3 天前
【FPGA数字信号处理】离散信源香农熵计算:原理详解 + 纯Verilog可综合实现 + 全套仿真代码
fpga
FPGA小迷弟5 天前
FPGA开发Vivado Block Design/Vitis/SDK/xlinx/开发教程,保姆级别,一看就会!
网络协议·tcp/ip·fpga开发·verilog·fpga
FPGA小迷弟5 天前
基于FPGA实现智能网卡的概念,什么是智能网卡
网络协议·tcp/ip·fpga开发·verilog·fpga
hi冻鱼6 天前
PCIe + DDR架构(一):实测——块长从4 KiB 换 1 MiB,带宽从133 MB/s 涨到 3179 MB/s
性能测试·fpga·pcie·mig·xdma·1024程序员节·ddr3
FPGA小迷弟6 天前
用 Claude Code 重构遗留系统:从评估到落地的完整指南
fpga开发·dsp开发·fpga·1024程序员节·sdr·无线电