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

Jim*_*uck 1 c assembly gcc

我有以下 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)

分号将该行的其余部分标记为注释,因此汇编器会忽略它。