section属性中的“aw”标志是什么意思?

时间:2011-06-06 13:35:42

标签: gcc attributes linker

在以下代码行中(声明一个全局变量),

unsigned int __attribute__((section(".myVarSection,\"aw\",@nobits#"))) myVar;

“aw”标志是什么意思?

我的理解是nobits标志会阻止变量初始化为零,但我很难找到有关“aw”标志的信息。

另外,@和#在nobits标志周围有什么意义?

2 个答案:

答案 0 :(得分:17)

section("section-name")属性通过生成以下汇编程序行将变量放在特定部分中:

.section    section-name,"aw",@progbits

当您将section-name设置为".myVarSection,\"aw\",@nobits#"时,您会利用某种" code injection"在GCC中产生:

.section    .myVarSection,"aw",@nobits#,"aw",@progbits

请注意,#符号会开始一行注释。

有关.section指令的完整说明,请参阅GNU Assembler manual。一般语法是

.section name [, "flags"[, @type[,flag_specific_arguments]]]

所以"aw"是标志:

  • a :部分可分配
  • w :此部分是可写的

@nobits是一种类型:

  • @nobits :section不包含数据(即,section只占用空间)

以上所有内容也适用于functions,而不仅仅是变量。

答案 1 :(得分:4)

  

“aw”标志是什么意思?

这意味着该部分是可分配的(即它在运行时被加载到内存中)并且是可写的(当然也是可读的)。

  

我的理解是nobits标志会阻止变量初始化为零,但我很难找到有关“aw”标志的信息。

     

另外,@和#在nobits标志周围有什么意义?

@nobits(@只是名称的一部分)意味着该部分未存储在磁盘上的映像中,它只存在于运行时(并且在启动时填充为零)。

#character开始注释,因此除了你指定的内容之外,编译器将添加的内容将被忽略。