最近在我的嵌入式项目里,突然多了10KB的静态内存占用。我需要定位这10KB到底去哪儿了,顺手记录一下方法。
从源码到固件
先看从源代码编译链接得到固件的流程:
.c/.h编译后得到目标文件.o- 若干
.o和若干静态库.a链接成.elf - 再经打包/烧录工具处理成固件,烧录到Flash
用 ELF 和 MAP 看内存去哪了
拿到 .elf 后,其实所有代码和数据布局信息都在里面了:
- 看
.bss:静态/全局未初始化变量占用多少RAM - 看
.data:有初值的全局/静态变量占用多少RAM const等占用的Flash空间也能查到
如果能配合对应的 .map 文件会更好,就能知道某个符号是被谁拉进来的。
定位多出来的 10KB
有了定位方法,事情就比较直接:控制参与编译的代码,对比生成的 .elf 中 .bss 的差异,再通过 .map 定位差异来源。
在我这里,是引入了 mbedtls,导致额外多了约10KB静态内存占用。