为什么OMAPL138平台定义10MByte数组,编译出来文件总是1.79MB
text段 data段 stack都在ddr 大小有24M
数组已经初始化值,不会存在bss段,且已经引用,不会被编译优化
链接出来的obj文件,也是10.xMB大小,但是out文件总是接近2MB,即使把数组大小弄成20MB,也是接近2MB
目的是:生成一个10MB的目标文件,然后用仿真器load到板子里面,来测试比对两个仿真器的速度
Tony Tang:
全局变量初始值在.cinit段里(初始化段)。全局变量在.bss段(未初始化段)
jinjinjin:
回复 Tony Tang:
能给个解决办法吗? 我IDK AM572X平台是正常的
Shine:
看一下map文件,map文件里会有各个段的使用情况。
Tony Tang:
回复 jinjinjin:
wenjin zhen能给个解决办法吗? 我IDK AM572X平台是正常的
我不认为这个跟芯片相关,只可能跟CCS,compiler version相关。可以把map文件发上来看一下。
jinjinjin:
回复 Tony Tang:
OMAPARM9.zip
Tony Tang:
回复 jinjinjin:
从下面可以看出初始化值在.cinit里,是根据初始化值实际长度来的,不是定义的数组长度。
char block[10485760] = {33, 22, 11 };
jinjinjin:
回复 Ryan BL:
是的 你解决了我的问题 能顺带介绍一下原理吗 祝好
Ryan BL:
回复 jinjinjin:
因为你不可能把很大一块数据完全初始化,基本上都是大块的0,汇编写的话可以用汇编写递增/递减或某个固定数值的数组;程序链接的时候会扫描这些大块的初始化过的数据,稍微解析之,然后尝试用在main前添加预置的链接钩子,钩子里的操作就是一系列的memset/memcpy或连续递增|减的初始化数组。这个可以有效减少程序镜像大小,减少存储空间和加载速度;但是也带来链接后的镜像分部与最终运行时的内存分布很可能不一致;
实际上,bss段也是这样的处理,只是固定为一个memclear操作。使用-cr操作可以强制取消上面的动作,这样程序员能在链接后检查数据的内存分布是否与预期一直