1

我有一个用 ghs 编译器编译的代码,其中的部分已在 c 代码中定义为

#pragma ghs section data = ".shareddata"

// some c code

#pragma ghs section data = default 

我们如何为上述使用 gcc 的部分定义 pragma

4

1 回答 1

4

一般来说,gcc 不鼓励使用 pragma,而是建议您对函数和变量都使用属性。

来自 GCC 手册(“声明函数的属性”):

通常,编译器将它生成的代码放在文本部分中。但是,有时您需要额外的部分,或者您需要某些特定功能出现在特殊部分中。section 属性指定函数位于特定的部分中。例如,声明:

extern void foobar (void) __attribute__ ((section ("bar")));

将函数 foobar 放在 bar 部分。

从“指定变量的属性”

通常,编译器将它生成的对象放在数据和 bss 等部分中。但是,有时您需要额外的部分,或者您需要某些特定变量出现在特殊部分中,例如映射到特殊硬件。section 属性指定变量(或函数)位于特定的部分中。例如,这个小程序使用了几个特定的​​节名:

    struct duart a __attribute__ ((section ("DUART_A"))) = { 0 };
    struct duart b __attribute__ ((section ("DUART_B"))) = { 0 };
    char stack[10000] __attribute__ ((section ("STACK"))) = { 0 };
    int init_data __attribute__ ((section ("INITDATA")));          
    main()
    {
        /* Initialize stack pointer */
        init_sp (stack + sizeof (stack));          
        /* Initialize initialized data */
        memcpy (&init_data, &data, &edata - &data);
        /*  Turn on the serial ports */
        init_duart (&a);
        init_duart (&b);
    }

将 section 属性与全局变量一起使用,而不是局部变量,如示例中所示。

您可以将 section 属性与已初始化或未初始化的全局变量一起使用,但链接器要求每个对象定义一次,但未初始化的变量暂时位于 common(或 bss)部分中并且可以多次“定义”。使用 section 属性会更改变量进入的部分,如果未初始化的变量有多个定义,可能会导致链接器发出错误。您可以强制使用 -fno-common 标志或 nocommon 属性初始化变量。某些文件格式不支持任意节,因此节属性并非在所有平台上都可用。如果您需要将模块的全部内容映射到特定部分,请考虑改用链接器的工具。

于 2015-03-05T13:43:38.323 回答