如何为整个C文件添加__attribute__((section(".protected")))属性?
如何为整个C文件添加
__attribute__((section(".protected")))属性 有两种可靠的方法可以实现为整个C文件指定段属性,完全不需要把所有代码塞进main()里:
方法1:使用编译器#pragma指令(代码内控制)
在目标C文件的最开头添加#pragma GCC section指令,指定代码、数据和未初始化数据段都归入.protected,示例:
// 放在文件最顶部,include语句前后均可 #pragma GCC section text=".protected", data=".protected", bss=".protected" // 你的所有代码、变量定义都写在这里 #include <stdio.h> int global_var = 10; void func() { printf("Hello\n"); } int main() { func(); return 0; } // 可选:如果文件后续有不需要归入.protected的内容,可恢复默认段设置 #pragma GCC section
这个指令会让该文件中所有后续定义的函数(text段)、已初始化全局变量(data段)、未初始化全局变量(bss段)自动放入.protected段。注意:GCC、Clang均支持该写法,其他编译器需查阅对应文档调整语法。
方法2:通过链接脚本控制(无需修改代码)
既然你已经在链接器文件中声明了.protected段,可直接修改链接脚本,将目标C文件的所有段合并到.protected中。示例链接脚本片段:
.protected : { // 替换成你的目标文件名,比如main.o your_file.o(.text .text.* .data .data.* .bss .bss.*) } > /* 指定存储区域,比如FLASH */
这种方法无需改动C代码,直接在链接阶段将目标文件的所有代码、数据段强制归入.protected,适合不想修改业务代码的场景。
注意事项
- 放弃把所有代码塞进
main()的临时方案:这种做法会导致变量作用域混乱、函数无法被外部调用,且代码可读性极差,完全没必要。 - 使用方法1时,务必让
#pragma GCC section放在所有函数和变量定义之前,否则前面的定义不会受指令影响。
内容的提问来源于stack exchange,提问作者Jip Helsen
相关产品推荐
相关产品推荐

