linux GCC链接生成的map文件
什么是MAP文件?
map文件是如何生成的?
为什么要在调试时生成MAP文件?
深入了解map文件
BES平台的代码已经构建完成,编译代码过程中自动生成map文件,保存在out/…/目录下
如图:
Archives linked
Archive member included to satisfy reference by file (symbol)
显示调用库函数信息:来自那个.a中的哪个.o
Allocating common symbols
末初始化的全局变量:大小、变量、出处
Discarded input sections
没有被调用的函数和变量
Memory Configuration
根据.ld文件中MEMORY来划分的内存区域:名称、起始地址、长度、访问权限(x执行权限、r读权限、w写权限、xr可读可执行、xrw可读可写可执行)。
Linker script and memory map
链接脚本和内存映射
在MAP文件中查看剩余空间
在map文件中,全局搜索free可以查看相关区域剩余空间
如果需要释放空间,首先要查map文件,RAM总共多少,编译基础多少,增加宏之后还剩多少,然后看下plat文件的具体分配。
空间不够死机
举个例子:
最近有人问了一个问题,听音乐过程中,耳机死机,日志显示如下:
[syspool_get_buff] size = 73728 , free size = 69360
System pool in shortage! To allocate size 73728 but free size 69360.
很明显,这是音频播放的空间不够死机了,忧郁BES音频播放空间是动态分配的,所以要从其他地方释放空间。解决方向有两,一是关闭不必要的算法,减少算法空间占用,二是检查系统空间分配,将没由用到的空间释放出来。
如:RAMCPX:RAMCPX可以减小,如图就多出0x7e20,看能否正常运行,RACMPX_BASE应该也要改。
RAMCP:RAMCP可以增大,如果编译能过,就持续增大,编译不过可能是RAM不够,就改回去。
FRAMX:还能减小0x5000
修改的地方在plat_addr_map_bestXXXX.h文件中,当然,因为具体芯片不一样,代码可能有不同差别。