【问题标题】:pragma directives for gccgcc 的编译指示指令
【发布时间】:2013-07-23 10:10:34
【问题描述】:

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

#pragma ghs section data = ".shareddata"

// some c code

#pragma ghs section data = default 

我们如何为使用 gcc 的部分定义编译指示

【问题讨论】:

  • 您为什么希望在非实时环境中拥有不同的内存部分? (我只是想知道目的,以便稍后做一个简短的研究:))?
  • @Ordiel 例如:您可以定义一个宏来定义一些要存储在特殊部分中的结构。您可以在任何地方进行这些定义(意味着跨多个目标文件),并且由于一旦目标文件被链接并且它们的部分合并后,每个这样的结构在编译时都放在特殊的部分中,您仍然可以在运行时逐个遍历数组。例如,这用于调用 C++ 全局初始化程序。

标签: gcc pragma sections


【解决方案1】:

一般来说,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 属性初始化变量。 某些文件格式不支持任意节,因此节属性并非在所有平台上都可用。如果您需要将模块的全部内容映射到特定部分,请考虑改用链接器的工具。

【讨论】:

    猜你喜欢
    • 2019-11-27
    • 1970-01-01
    • 2023-03-22
    • 2011-02-10
    • 2022-01-09
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多