关于__attribute__中section部分的一些了解

转自:https://blog.csdn.net/sadshen/article/details/9419267


诸如我辈菜鸟,对编译器了解比较少,面对代码中出现的陌生字眼真是茫然不知所措。今天查阅了一些资料,总算是有了一点了解,现在将些许理解记录在案。


__attribute__这个关键词是GNU编译器中的编译属性,ARM编译器也支持这个用法。__attribute__主要用于改变所声明或定义的函数或 数据的特性,它有很多子项,用于改变作用对象的特性。比如对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除 返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。当然,__attribute__肯定有很多的用法,今天就用到了section部分,所以就只针对这个做一些记录。

提到section,就得说RO RI ZI了,在ARM编译器编译之后,代码被划分为不同的段,RO Section(ReadOnly)中存放代码段和常量,RW Section(ReadWrite)中存放可读写静态变量和全局变量,ZI Section(ZeroInit)是存放在RW段中初始化为0的变量。


于是本文的大体意思就清晰了,__attribute__((section("section_name"))),其作用是将作用的函数或数据放入指定名为"section_name"对应的段中。


MDK给出的帮助文档如下,他将__attribute__的用法归类到编译器特性里,以变量和函数的两种用法做区分。

1.编译时为变量指定段

[cpp]  view plain  copy
  1. __attribute__((section("name")))  
  2. RealView Compilation Tools for µVision Compiler Reference Guide Version 4.0   
  3.    
  4. Home > Compiler-specific Features > Variable attributes > __attribute__((section("name")))   
  5.   
  6. 4.5.6. __attribute__((section("name")))  
  7. Normally, the ARM compiler places the objects it generates in sections like data and bss. However, you might require additional data sections or you might want a variable to appear in a special section, for example, to map to special hardware. The section attribute specifies that a variable must be placed in a particular data section. If you use the section attribute, read-only variables are placed in RO data sections, read-write variables are placed in RW data sections unless you use the zero_init attribute. In this case, the variable is placed in a ZI section.  
  8.   
  9. Note  
  10. This variable attribute is a GNU compiler extension supported by the ARM compiler.  
  11.   
  12. Example  
  13. /* in RO section */  
  14. const int descriptor[3] __attribute__ ((section ("descr"))) = { 1,2,3 };  
  15. /* in RW section */  
  16. long long rw[10] __attribute__ ((section ("RW")));  
  17. /* in ZI section *  
  18. long long altstack[10] __attribute__ ((section ("STACK"), zero_init));/  


2.编译时为函数指定段

[cpp]  view plain  copy
  1. __attribute__((section("name")))  
  2. RealView Compilation Tools for µVision Compiler Reference Guide Version 4.0   
  3.    
  4. Home > Compiler-specific Features > Function attributes > __attribute__((section("name")))   
  5.   
  6. 4.3.13. __attribute__((section("name")))  
  7. The section function attribute enables you to place code in different sections of the image.  
  8.   
  9. Note  
  10. This function attribute is a GNU compiler extension that is supported by the ARM compiler.  
  11.   
  12. Example  
  13. In the following example, Function_Attributes_section_0 is placed into the RO section new_section rather than .text.  
  14.   
  15. void Function_Attributes_section_0 (void)  
  16.     __attribute__ ((section ("new_section")));  
  17. void Function_Attributes_section_0 (void)  
  18. {  
  19.     static int aStatic =0;  
  20.     aStatic++;  
  21. }  
  22. In the following example, section function attribute overrides the #pragma arm section setting.  
  23.   
  24. #pragma arm section code="foo"  
  25.   int f2()  
  26.   {  
  27.       return 1;  
  28.   }                                  // into the 'foo' area  
  29.   __attribute__ ((section ("bar"))) int f3()  
  30.   {  
  31.       return 1;  
  32.   }                                  // into the 'bar' area  
  33.   int f4()  
  34.   {  
  35.       return 1;  
  36.   }                                  // into the 'foo' area  
  37. #pragma arm section  



记录完毕,希望能够给遇到同样问题的朋友些许帮助。

你可能感兴趣的:(c)