本人想通过RW段的载入地址找到变量的初始值来对变量进行反初始化,纯粹为了节约空间,即变量的值被程序改变后需要再次初始化使读取其载入地址上的值,编译器用RealView MDK。结果发现该方法行不通,原因是映像文件的RW段是压缩过的,观察RW载入地址的memory窗口就可以发现定义的变量并非程序里写入的值,如变量的值为0x2a2a2a2a,它只存储一个0x2a。后来打开汇编代码,进入__main函数内,看能否通过汇编找到压缩的算法,发现解压缩的代码是thumb代码,同时会生成数据的前导部分,该前导与解压缩有关。为了彻底弄明白,我又建了一个小工程,只加入一个c文件,用同样的方法跟踪,发现又没有压缩?难道只有数据大到一定程度才会压缩?更奇怪的是未初始化或者初始化为0的单个变量被定位到了.data段,只有未初始化的数组才会定位到.bss段。.data和.bss到底和RW,ZI有啥对应关系呀?各位大侠,有研究过此类问题的吗? |