考虑以下程序: -
int busy[53] = { 1,2} ;
int barra[50] = {4,5};
int main(void)
{
int bb;
while (1)
{
bb = barra[3];
}
}
我使用带有参数“-Wl, - gc-sections -fdata-sections”的gcc编译上面的程序,并且在调试时我发现编译器/链接器没有为数组繁忙分配任何内存,因为这个数组不是在应用程序中的任何地方使用,如果我在无限循环中删除行,GC dint也为barra数组分配任何内存。
然后我改变了相同的程序,使忙碌和barra未初始化的数组如下 -
int busy[53];
int barra[50];
现在我使用相同的命令行参数编译新程序(在循环中使用行),当我调试时,发现编译器/链接器为busy和barra数组分配了内存,而不仅仅是barra。如果我在无限循环中删除行并重新编译,GC dint会为两个数组分配任何内存,与初始化数组相同。
所以我很好奇为什么编译器/链接器/ GC(不确定是哪一个)在程序中只使用一个数组时为两个未初始化的数组分配内存?
相同的情况init数组按预期工作,因为它只为程序中使用的数组分配内存。
对于bss中的变量,这是一个错误还是一些调整?
使用GCC - 4.9.0 20140319
答案 0 :(得分:0)
我只能猜测,但可能-fdata-sections
仅适用于“真实”数据部分,而不适用于bss部分。
基本上,
int busy[53] = { 1,2} ;
int barra[50] = {4,5};
int ubusy[53];
int ubarra[50];
将每个busy
和barra
放入他们自己的部分,但仍会创建一个包含ubusy
和ubarra
的bss部分。
链接器因此看到busy
未被使用并丢弃它,但使用了bss
(即使不是完整的)并且因此被保留。