我有以下 C 代码:
struct myStruct_t
{
const char m_name[60];
const uint32_t m_data;
};
const struct myStruct_t myStruct
__attribute__(( __aligned__( 64 ), section(".init") )) =
{
"myName",
(uint32_t)&someOtherStruct
};
Run Code Online (Sandbox Code Playgroud)
当我在 gcc 4.1.1(适用于 PS3)中编译时,我收到警告:
1>c:/t/ccy6.s: Assembler messages:
1>c:/t/ccy6.s(106): Warning: setting incorrect section attributes for .init
Run Code Online (Sandbox Code Playgroud)
警告指向的汇编代码是下面的“.section”子句:
.section .init,"aw",@progbits
.align 6
.type myStruct , @object
.size myStruct , 64
myStruct :
.ascii "myName"
.long someOtherStruct
Run Code Online (Sandbox Code Playgroud)
它不喜欢标志的“w”(可写)部分,因为 .init 中的内容是只读的,并且所有可能位置中的“const”不会迫使编译器不吐出“w”。我如何告诉编译器“不,真的,它是 const,我不是在开玩笑”?
小智 6
这是 GCC 自动指定 .section 指令参数的问题。幸运的是,节名称参数被直接复制到程序集输出中,从而允许您解决此问题。
该指令:
__attribute__ ((section(".init")))
Run Code Online (Sandbox Code Playgroud)
生成此程序集:
.section .init,"aw",@progbits
Run Code Online (Sandbox Code Playgroud)
要删除警告,您可以指定如下属性:
__attribute__ ((section(".init,\"ar\",@progbits ;")))
Run Code Online (Sandbox Code Playgroud)
这将生成:
.section .init,"ar",@progbits ;"aw",@progbits
Run Code Online (Sandbox Code Playgroud)
分号将该行的其余部分标记为注释,因此汇编器会忽略它。