我有一个用ghs编译器编译的代码,其中的部分已在c代码中定义为
#pragma ghs section data = ".shareddata"
// some c code
#pragma ghs section data = default
我们如何为上述事物使用gcc定义部分的编译指示
答案 0 :(得分:3)
通常,gcc不鼓励使用编译指示,而是建议您为函数和变量使用属性。
从GCC手册(“声明功能声明”):
通常,编译器会将它生成的代码放在文本部分中。但是,有时您需要其他部分,或者需要某些特定功能才能显示在特殊部分中。 section属性指定函数位于特定部分中。例如,声明:
extern void foobar (void) __attribute__ ((section ("bar")));
将函数foobar放在条形部分。
从“指定变量的属性”
通常,编译器将它生成的对象放在data和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属性与初始化或未初始化的全局变量一起使用,但链接器要求每个对象定义一次,除了未初始化的变量暂时进入公共(或bss)部分并且可以多次“定义”。使用section属性可以更改变量所涉及的部分,如果未初始化的变量具有多个定义,则可能导致链接器发出错误。您可以使用-fno-common标志或nocommon属性强制初始化变量。 某些文件格式不支持任意节,因此所有平台上都不提供section属性。如果需要将模块的全部内容映射到特定部分,请考虑使用链接器的工具。