如何摆脱gcc汇编程序警告“在C代码中为.init设置不正确的部分属性”?

时间:2009-04-13 20:15:59

标签: c gcc assembly

我有以下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,我不是在开玩笑”?

5 个答案:

答案 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()之前调用,而它的析构函数将在之后调用。
  • 您可以编写一个小工具来手动修补目标文件。我很确定这已经存在了。也许在这里:http://www.eresi-project.org/
  • 您可以联系GCC开发人员。也许这是一个错误。

答案 3 :(得分:0)

为了上帝的缘故,男人,不要试图用gcc作为汇编程序!我没有看到任何理由为什么这个东西应该在.init部分(它不是代码),但如果你必须在那里,写下你想要的汇编代码(你有一个良好的开端;只需编辑),将其置于源控制下,放在每个平台的适当位置,然后完成!

答案 4 :(得分:0)

如果要将myStruct置于特殊位置,请使用链接器文件。

http://sourceware.org/binutils/docs-2.19/ld/Scripts.html#Scripts