工具/软件:TI C/C++编译器
我正在查看TI ARM优化C/C++编译器的支持库中的malloc()代码路径。
我研究的一个路径是在编译系统时malloc()如何运行,而没有分配堆(即指定--heap_size=0到链接器)。
如TI汇编器和TI编译器文档中所述,TI连接器:
链接器还会创建一个全局符号__SYSMEM_SIZE,并为其分配一个值,该值等于堆的大小(以字节为单位)。
浏览代码,特别是memory.c中的minit()代码,很明显该代码不能处理__SYSMEM_size的0。 如果__SYSMEM_SIZE为0,则调用malloc()会损坏内存。
但是,编译链_iS_正在尝试处理这种情况。 链接程序似乎强制最小大小为8。 如果指定--heap_size=0 (或者,大概--heap_size=7),TI链接程序将实际生成一个8字节的.sysmem段,并将__SYSMEM_SIZE设置为8。
我会而且我也会争辩说,这种在链接器内实现部分C库功能的方法不是完全的责任分离。
我单独认为,将部分功能放在链接器中会隐藏功能;能够查看C库源代码对我们非常有价值,但链接器更不透明。
最后,我认为这种行为令人困惑。 我本来希望能够写我自己的代码,可以对照0检查__SYSMEM_SIZE,以确定是否有任何堆编译到固件中。 不得不用8 (或可能的其他体系结构相关值)来写此检查将是一个令人惊讶的结果。
我想请求更新memory. c代码以显式处理__SYSMEM_size为0,链接程序也相应地进行了更新。
如果此请求未获批准,我希望请求相应地将此链接器行为记录在minit()源代码本身以及TI手册中。
--谢谢