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

时间:2018-10-10 07:05:01

标签: c embedded cross-compiling microcontroller

我已经为模拟器构建了一些代码,现在正在尝试使用TI的免费工具链交叉编译为具有64kb nvram的目标。编译器声称我的代码比ROM还要大34kb:

(...) msp430-elf/bin/ld: region `ROM' overflowed by 33716 bytes

另一行表示无法将.text字段放入其分配的空间。我不敢相信我的添加总数为34kb,更不用说使二进制文件超出此数量了。

  • 我的代码添加到项目中的.o文件仅占项目总数的一小部分(1.9MB的200kb),并且我从项目开始时取出了很多组件。 / li>
  • 我已经将-Os -s标志传递给了编译器。
  • 新代码具有大约100个字符的字符串文字。
  • 我的代码使用了许多math.h函数(实际上是唯一执行浮点运算的部分),调用了strtod,并调用了sprintf

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

3 个答案:

答案 0 :(得分:20)

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

例如,查看computed: { age() { const ageDifMs = Date.now() - this.birthday.getTime(); const ageDate = new Date(ageDifMs); return Math.abs(ageDate.getUTCFullYear() - 1970); }, birthday() { const birthday = new Date(); birthday.setUTCFullYear(this.year); birthday.setUTCMonth(this.month); birthday.setUTCDate(this.day); return birthday; }, isUnderThree() { return this.age < 3; } } https://manpages.debian.org/jessie/binutils/size.1.en.html

size也值得一试,因为它可以显示目标代码https://manpages.debian.org/jessie/binutils/nm.1.en.html

中每个符号的大小。

仔细检查nmsize的输出将使您直观地了解哪些占用了很多空间,哪些不占用了空间。

知道nmprintf以及许多更复杂的库函数通常会占用相当几KB的额外ROM。

与使用硬浮点(即使用软件仿真还是使用硬件指令来处理浮点)相比,使用软浮点对浮点的支持还将使代码膨胀。

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

答案 1 :(得分:6)

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

TI的免费Code Composer Studio确实提供了非常强大的内存可视化(查看->内存分配)

对我大有帮助的是更改了链接器设置和其他优化选项中的初始化模型。我目前不使用MSP430控制器,因此无法再告诉您详细信息。

答案 2 :(得分:0)

还有AMAP,这是一种易于查看的.map文件的小gui:http://www.sikorskiy.net/prj/amap/

拥有一个类似于kdirstat的工具,使您可以直观地比较符号大小会很好。

尽管不能直接回答该问题,但最终还是使用了Voidware的CORDIC实现来避免使用<math.h>https://github.com/enthdegree/cordic_wrapped

中的大型函数