代码库的哪些部分使二进制文件变大?

ent*_*ree 24 c embedded microcontroller cross-compiling

我已经为模拟器构建了一些代码,现在我正在尝试使用TI的免费工具链来交叉编译到64kb的nvram目标.编译器声称我的代码大约是ROM以外的34kb:

(...) msp430-elf/bin/ld: region `ROM' overflowed by 33716 bytes
Run Code Online (Sandbox Code Playgroud)

另一条线说它不适合.text场地进入其分配的空间.我无法相信我的总数增加了34kb,更不用说使二进制文件溢出这个数量了.

  • 我的代码添加到项目中的.o文件只占项目总数的一小部分(1.9MB),我已经取出了项目中的大量组件.
  • 我已经在编译器中传递了-Os -s标志.
  • 新代码有大约100个字符的字符串文字.
  • 我的代码使用了很多math.h函数(实际上它是唯一进行浮点运算的部分),调用strtod和调用sprintf

是否有任何工具或方法来分解导致二进制文件如此庞大的原因?

Mor*_*sen 20

GNU binutils有一些工具可以帮助您确定每个符号或每个目标文件的大小.

size例如,查看:https://manpages.debian.org/jessie/binutils/size.1.en.html

nm也值得一试,因为它可以显示目标代码中每个符号的大小:https://manpages.debian.org/jessie/binutils/nm.1.en.html

仔细检查输出,sizenm给你直觉,占用大量空间和不占用空间.

知道这一点printf,sprintf许多更复杂的库函数通常会占用相当多的KB额外ROM.

与使用硬浮点相比,使用软浮点的浮点支持也会使代码膨胀,即使用软件仿真与硬件指令来处理浮点.

有时编译器会添加惊人数量的膨胀:)


A.R*_*.C. 6

我曾经有一个小型MSP430控制器存在内存问题.如果可能使用负值或使用浮点,TI工具链会将大型库链接到二进制文件中.就我而言,它占总内存使用量的10%-20%.

TI免费的Code composer Studio确实提供了非常强大的内存可视化(View - > Memory Allocation)

帮助我很多的是改变链接器设置和其他优化选项中的初始化模型.我目前没有使用MSP430控制器,所以我不能再告诉你细节了.