.bss vs .data:static q32 vs static int

时间:2018-02-12 08:26:57

标签: c linker signal-processing

为DSP目标处理器编译和链接以下代码:

TEST.C

static q32 a[15] = { 
                          Q31(0.1f),Q31(0.2f),Q31(0.3f),Q31(0.4f),Q31(0.5f),
                          Q31(0.1f),Q31(0.2f),Q31(0.3f),Q31(0.4f),Q31(0.5f),
                          Q31(0.1f),Q31(0.2f),Q31(0.3f),Q31(0.4f),Q31(0.5f)
                        };

static int b[3] = { 1, 1, 0 };

int main() 
{
   // ... 
   return 0;
}

q32是一个固定点类型,4个字节。

链接代码后,.map文件告诉我以下内容: Test.o: .bss 60, .data 12

为什么a(60个字节)最终位于.bss部分,而b(12个字节)位于.data部分?我希望两者都进入.data

3 个答案:

答案 0 :(得分:1)

应该如何使用.bss。因为它应该表示未初始化的数据(我没有说它包含未初始化的变量!), 让我们说BSS段只保存没有任何值的变量,因此它实际上不需要存储这些变量。因此,BSS是一种优化,使得目标文件只保存单个值,现在就说变量所需的空间。这是15 * 4 = 60。

维基说,

  

BSS在运行时需要的大小记录在目标文件中,但BSS(与数据段不同)不会占用目标文件中的任何实际空间。

这是让你的可执行文件变小的一种方法。

现在,由于Q31是一个扩展为((q32)(int)((double)(x)*(double)0x80000000UL的宏,Q31(1.0f)在编译时显然仍然无法理解。因此,它被视为未初始化,因此进入.bss。

虽然已知((q32)(int)((double)(x)*(double)0x80000000UL是一个固定的常量表达式。

尝试输入固定值,您应该在.data段中看到它们。

无论如何,一旦程序加载完成,它在哪个部分无关紧要。

答案 1 :(得分:0)

在某些Q-something格式中,整数部分被固定分配给1或0.如果第一种情况适用于您的格式,q32仅包含零字节。 bbs段在启动时初始化为零。因此,将q32放在bbs中会避免一些初始化数据。

答案 2 :(得分:0)

未初始化的全局将进入.bss部分,而具有一些初始值的全局将进入.data部分。如果你有一个全局变量,ititial值为0(零)那么它将进入.bss部分作为优化最终二进制文件大小的方式。如果你的Q31(1.0f)解析为0,如果它的情况比上面的情况是[15]进入.bss部分而不是.data

的原因