This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

为什么没被用到的函数也会占用.ebss段?

Expert 1795 points

28035,已经开了4级优化,有个文件所有的函数都不会被Main函数直接或间接调用到,但是这个文件依然在.ebss段占用空间。为了验证这个问题,我新建一个空项目,把文件直接复制到项目中,保持main函数是空的,用release编译,结果这个文件依然出现在.ebss中。我也知道不是随便写个函数就能占用空间,但是这个函数确实很诡异,我把文件删减到最后剩下这么点代码,还能出现这个现象,编译器bug吗?编译器版本17.9.0,编译后占用5个字节,18.1.4编译后占用1个字节。

#include "DSP2803x_Device.h"


static Uint16 DummyDMXs[1] = {255}; 


#ifndef DMX_BUNCH
#define DMX_BUNCH(i) DummyDMXs[i-i]
#endif

void LedBunchsMacroScriptRGBW00(int nextFrame)
{
static Uint16 r,g,b,w;
int16 LedBunchsMacroTick;

LedBunchsMacroTick = 0;

DMX_BUNCH(4 * LedBunchsMacroTick ) = r;
DMX_BUNCH(4 * LedBunchsMacroTick + 1) = g;
DMX_BUNCH(4 * LedBunchsMacroTick + 2) = b;
DMX_BUNCH(4 * LedBunchsMacroTick + 3) = w;

}

这个问题很重要,因为我的代码是高度模块化的,代码量极大,但是每次编译都是编译其中某个部分,由于代码太零散,所以不可能到处用预编译语句,我也认为开优化后,没被main函数调用的函数和变量都不会占用空间,所以只在main函数中用预编译排除入口函数,结果发现这个问题。

  • 能否给出您的CMD文件?若是比较急的话您可以去英文论坛发帖求助
  • 谢谢回复,应该和CMD没关,我再次测试了一次,全新的工作区,用最新的CCS9,新建一个28035项目,只带一个main函数那种,然后把我上面那段代码新建个文件放进去,为了更加简化,我把 #include 也删了,Uint16改成long,这样什么都不用改动,直接可以编译,编译完了,.ebss还是出现了。编译器版本 V17.9.0,其他的版本我也不能用,但就算是V18.12版也一样,只是占空间小一点

    我去英文社区试试看吧