带有__attribute__的GCC变量被视为初始化

时间:2018-02-14 13:58:56

标签: c gcc attributes ld

如果我使用__attribute__(section(".section_i")),则将变量视为初始化变量。 让我们快速查看以下示例(声明为全局变量):

 static unsigned char array[1024] __attribute__((section (".section_i")));

即使我没有初始化数组,上面的声明也会将数据大小增加1k。 如何将变量标记为未初始化以避免增加数据部分?

1 个答案:

答案 0 :(得分:1)

static unsigned char array[1024] __attribute__((section (".section_i")));
     

即使我没有初始化数组,上面的声明也会将数据大小增加1k。如何将变量标记为未初始化以避免数据部分的增加?

好的,这实际上并不是关于"初始化"或"未初始化&#34 ;;这是关于变量是否被视为" common",不需要在可执行映像的数据中预先分配空间。 (未链接的目标文件包含部分;完全链接的可执行文件和共享库具有段。)

https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Common-Variable-Attributes.html#Common-Variable-Attributes 这是由"普通"属性,所以

static unsigned char array[1024] __attribute((section(".section_i"), common));

被记录为执行您想要的操作(假设您的链接器脚本合作;名为.section_i的部分必须放入适当的段中;由于历史原因,该段的名称可能是" BSS& #34)。但是,当我实际尝试使用编译器(我确实是GCC 7.3,x86_64-Linux的本机编译器)时,它会生成可能无法做正确的汇编语言。无论如何,你应该尝试使用你的编译器;这可能只是x86-64后端中的一个普通的旧bug,而且对于你正在使用的任何嵌入式环境,它可能不会在后端重复出现。

请注意,在得出结论不起作用之前,您应该检查完全链接的可执行映像。变量可能会占用定义它的目标文件中的空间,但不会占用可执行文件中的空间。

出于令人难以置信的愚蠢原因,我很遗憾,我甚至不知道并且不想尝试解释,也可以帮助调用.bss.section_i部分,而不仅仅是.section_i。这也可以使编写链接器脚本变得更容易。