疑难:同样的代码编译后得到的二进制文件完全不同。
某ARM编译平台(MTK手机平台)。仅编译的时间不同,没有修改任何东西。同一台机器环境一样。全编后得到的bin文件(ROM文件)完全不同,但功能未发现不同。请高手释疑!
分析:
1、比较ROM文件和Sym文件,发现的第一处不同是EXTSRAM_BSS_Limit_Ptr指向的地址内容不同。查找发现Bootarm.s文件有如下动作:
EXPORT EXTSRAM_BSS_Limit_Ptr
EXTSRAM_BSS_Limit_Ptr
IMPORT |Image$$EXTSRAM$$ZI$$Limit|
DCD |Image$$EXTSRAM$$ZI$$Limit|
可见是变量Image$$EXTSRAM$$ZI$$Limit的初值不同。查找整个工程,只发现在custom_scatstruct.c文件中有如下声明:
extern kal_uint32 Image$$EXTSRAM$$ZI$$Limit;
这个变量在哪里定义赋值的没找到,难道它是根据时间不同随机生成的?Why?看名字是某块存储区域的限制大小,这个不应该在编译阶段就产生区别了吧。
2、比较.lis文件(相当于Cbuilder中的.map文件),发现以下四个域的大小都不同:
ROM1、ROM3、ROM4、EXTSRAM.
如下表:
域 Build1(start:size) Build2(start:size)
ROM 0x08000000: 0x0000032c 0x08000000: 0x0000032c
ROM0 0x08001000: 0x00000054 0x08001000: 0x00000054
ROM1 0x08001054: 0x001f90f0 0x08001054: 0x001f9164
ROM2 0x081fa144: 0x00111ae4 0x081fa144: 0x00111ae4
ROM3 0x0830bc28: 0x000e437c 0x0830bc28: 0x000e43dc
ROM4 0x083effa4: 0x000e46ac 0x083effa4: 0x000e476c
...
EXTSRAM 0x00100280: 0x0023bd8c 0x00100280: 0x0023bd90
...
两次编译链接用的scatter文件完全相同,大致结构是这样:
ROM 0x08000000 0x00a00000
{
ROM 0x08000000 0x800
{
bootarm.obj (C$$code,+First)
}
ROM0 0x08001000 FIXED ;4KB
{
*.obj (SECINFO)
}
ROM1 +0x0 0x00400000
{
*.obj (LEADING_PART,+First)
*plutommi.lib (+RO-CODE)
*lcmmi.lib (+RO-CODE)
*l4_classb.lib (+RO-CODE)
*mtkapp.lib (+RO-CODE)
*l1_classb.lib (+RO-CODE)
*email.lib (+RO-CODE)
*l4misc.lib (+RO-CODE)
cpp_initialise.o(+RO)
cpp_finalise.o(+RO)
* (C$$pi_ctorvec)
* (C$$pi_dtorvec)
* (C$$ddtorvec)
}
ROM2 +0x0 0x00400000
{
; WAP family
*wapadp.lib (+RO-CODE)
*wap.lib (+RO-CODE)
*wae.lib (+RO-CODE)
*jataayu.lib (+RO-CODE)
*jataayuapp.lib (+RO-CODE)
*wapapp.lib (+RO-CODE)
*obigo05aadp.lib (+RO-CODE)
*obigo05alib.lib (+RO-CODE)
; J2ME family
*j2me_11.lib (+RO-CODE)
*j2me_hi.lib (+RO-CODE)
*jal.lib (+RO-CODE)
*ijet_adp.lib (+RO-CODE)
*jblendia.lib (+RO-CODE)
j2me_custom_*.obj (+RO-CODE)
}
ROM3 +0x0 0x00400000
{
.ANY (+RO-CODE)
}
ROM4 +0x0 0x00400000
{
.ANY (+RO-CODE)
}
ROM5 +0x0
{
.ANY (+RO-DATA)
}
ROM_TAIL +0x0
{
*.obj (SECINFO_TAIL)
}
...
怎么编译出来就不一样了呢?!
请高手解惑。