我有以下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
};
当我在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
警告指向的汇编代码是下面的“.section”条款:
.section .init,"aw",@progbits
.align 6
.type myStruct , @object
.size myStruct , 64
myStruct :
.ascii "myName"
.long someOtherStruct
它不喜欢标志的“w”(可写)部分,因为.init中的东西是只读的,并且所有可能位置的“const”都不会强迫编译器不吐出“ W”。我怎么能告诉编译器“不,真的,它是const,我不是在开玩笑”?
答案 0 :(得分:3)
这是GCC自动指定.section指令参数的问题。幸运的是,section name参数被直接复制到程序集输出中,允许您解决此问题。
该指令:
__attribute__ ((section(".init")))
生成此程序集:
.section .init,"aw",@progbits
要删除警告,您可以指定如下属性:
__attribute__ ((section(".init,\"ar\",@progbits ;")))
将生成:
.section .init,"ar",@progbits ;"aw",@progbits
分号将该行的其余部分标记为注释,因此汇编程序忽略它。
答案 1 :(得分:0)
狂野的猜测,但也许它设置错误的属性是“aw”,这表示“可写”给我。如果结构中的所有内容都是const,它仍会这样做吗?
编辑:随机谷歌似乎暗示“w”也可能代表“弱”?
答案 2 :(得分:0)
在具有GCC 4.3.3的GNU / Linux PC上,.init不可写。我没有在文档中找到如何手动设置部分属性。
也许它没有多大帮助,但这里有一些建议:
main()
之前执行一些代码,你可以使用C ++对象。它的构造函数将在main()
之前调用,而它的析构函数将在之后调用。答案 3 :(得分:0)
为了上帝的缘故,男人,不要试图用gcc
作为汇编程序!我没有看到任何理由为什么这个东西应该在.init
部分(它不是代码),但如果你必须在那里,写下你想要的汇编代码(你有一个良好的开端;只需编辑),将其置于源控制下,放在每个平台的适当位置,然后完成!
答案 4 :(得分:0)
如果要将myStruct置于特殊位置,请使用链接器文件。
http://sourceware.org/binutils/docs-2.19/ld/Scripts.html#Scripts