如何定位嵌入式项目中突增的静态RAM

最近在我的嵌入式项目里,突然多了10KB的静态内存占用。我需要定位这10KB到底去哪儿了,顺手记录一下方法。

从源码到固件

先看从源代码编译链接得到固件的流程:

  1. .c / .h 编译后得到目标文件 .o
  2. 若干 .o 和若干静态库 .a 链接成 .elf
  3. 再经打包/烧录工具处理成固件,烧录到Flash

用 ELF 和 MAP 看内存去哪了

拿到 .elf 后,其实所有代码和数据布局信息都在里面了:

  • .bss:静态/全局未初始化变量占用多少RAM
  • .data:有初值的全局/静态变量占用多少RAM
  • const 等占用的Flash空间也能查到

如果能配合对应的 .map 文件会更好,就能知道某个符号是被谁拉进来的。

定位多出来的 10KB

有了定位方法,事情就比较直接:控制参与编译的代码,对比生成的 .elf.bss 的差异,再通过 .map 定位差异来源。

在我这里,是引入了 mbedtls,导致额外多了约10KB静态内存占用。