我有一个用 ghs 编译器编译的代码,其中的部分已在 c 代码中定义为
#pragma ghs section data = ".shareddata"
// some c code
#pragma ghs section data = default
我们如何为上述使用 gcc 的部分定义 pragma
一般来说,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 属性初始化变量。某些文件格式不支持任意节,因此节属性并非在所有平台上都可用。如果您需要将模块的全部内容映射到特定部分,请考虑改用链接器的工具。