搜索
bottom↓
回复: 46

发现IAR的怪事,同一代码不同电脑生成的烧录文件不同。

[复制链接]

出0入0汤圆

发表于 2015-10-19 23:05:08 | 显示全部楼层 |阅读模式
    由于要接收另一家公司为我们开发的产品源代码,为了保证源代码与已生产的产品源代码一致,在接收对方源码时,只要编译出来的烧录文件与已生产的产品的烧录文件一致就接受,否则不接收,然后怪事出现了,经测试发现,用同一个版本的IAR,完全相同的操作系统(同一个系统装两台电脑),只是电脑的硬件不同,同一个源代码工程,两台电脑生成的烧录文件居然会不一样,致使无法接收源代码,而用keil完全没有这种事,真是见鬼了,肯定有与我遇到相同困惑的朋友,这是什么情况?原因是什么?怎么解决的?? 使用的版本为IAR Embedded Workbench for ARM 6.30.1。如有和我相同需求的朋友,一定注意了,一定不能用IAR。

出0入0汤圆

发表于 2015-10-19 23:32:15 | 显示全部楼层
目标代码中应该有编译时间的ASCII码

出0入0汤圆

 楼主| 发表于 2015-10-20 00:04:25 来自手机 | 显示全部楼层
没有时间,日期之类的代码。

出10入95汤圆

发表于 2015-10-20 00:06:47 | 显示全部楼层
发行模式/调试模式?

出0入0汤圆

发表于 2015-10-20 00:11:00 | 显示全部楼层
会不会有assert之类的把路径也搞进去了

出0入0汤圆

发表于 2015-10-20 06:58:03 来自手机 | 显示全部楼层
有可能,把软件授权信息编译到hex中,可以查盗版

出0入0汤圆

 楼主| 发表于 2015-10-20 07:36:54 来自手机 | 显示全部楼层
回复6楼,用的是和谐版本。

出0入0汤圆

 楼主| 发表于 2015-10-20 07:39:48 来自手机 | 显示全部楼层
回复6楼,如果是通过这种方式查盗版,那手法还是有点高明,期待正版用户,验证一下。

出0入0汤圆

 楼主| 发表于 2015-10-20 07:51:33 来自手机 | 显示全部楼层
回复4楼,IAR的烧录文件还分烧录模式与调试模式?

出0入0汤圆

发表于 2015-10-20 08:43:53 | 显示全部楼层
转成bin再判断一下, HEX里有时候会有文件名 日期等注释信息

出0入0汤圆

发表于 2015-10-20 08:45:39 | 显示全部楼层
mark 。 等待结果。

出5入8汤圆

发表于 2015-10-20 08:48:41 | 显示全部楼层
是不是优化等级不同导致的,你查看一下工程设置中的优化等级

出0入0汤圆

发表于 2015-10-20 08:49:13 | 显示全部楼层
同意10楼,建议都转成bin文件,进行比较核对,
如果bin文件对不上,那就是有问题,

楼主还要确认源码部分有没有相同的iar工程文件,
新编译的程序是否同原来iar配置相同,

出0入0汤圆

 楼主| 发表于 2015-10-20 08:55:08 来自手机 | 显示全部楼层
回复12楼,两台电脑是用的同一个工程,所有的设置都是一样的。

出0入0汤圆

 楼主| 发表于 2015-10-20 08:57:02 来自手机 | 显示全部楼层
如果确定是用这种方式查盗版,一查一个准,大家可要注意了。

出0入0汤圆

发表于 2015-10-20 08:59:14 | 显示全部楼层
debug和release模式注意下

出0入0汤圆

 楼主| 发表于 2015-10-20 09:00:02 来自手机 | 显示全部楼层
回复13楼,hex不一样,bin肯定也不一样了。

出0入0汤圆

发表于 2015-10-20 09:02:04 | 显示全部楼层
zj2003 发表于 2015-10-20 07:51
回复4楼,IAR的烧录文件还分烧录模式与调试模式?

就是编译选项   MDK也有

出0入0汤圆

 楼主| 发表于 2015-10-20 09:02:31 来自手机 | 显示全部楼层
整个代码有70k左右,用两台电脑编译后,有100多处不同。

出0入0汤圆

发表于 2015-10-20 09:05:26 | 显示全部楼层
时间 日期 路径
diff bin 文件
diff 每个源文件生成的asm文件
有些差异项是可以接受的。
但发行时,都要发bin文件,不然怎么死的都不知道,比如编译器使用了环境变量。

出0入0汤圆

发表于 2015-10-20 09:07:57 | 显示全部楼层
真的假的?能拿一个普通的demo试下有没有这种问题。然后发出来给我们也一起验证下。

出0入0汤圆

发表于 2015-10-20 09:28:35 | 显示全部楼层
要求对方将代码转化为MDK的,然后用MDK来验收

出0入0汤圆

发表于 2015-10-20 09:31:49 | 显示全部楼层
另外,两台电脑生成的代码,运行起来有差别吗?

出0入0汤圆

 楼主| 发表于 2015-10-20 09:51:49 来自手机 | 显示全部楼层
回复23楼,两台电脑生成的代码运行起来没有差异。

出0入0汤圆

 楼主| 发表于 2015-10-20 09:55:01 来自手机 | 显示全部楼层
回复22楼,如果IAR的版本不一样,生成的hex会完全不一样,有测试过6.5版本的iar与6.3的,生成的完全不一样。

出0入0汤圆

发表于 2015-10-20 10:58:23 | 显示全部楼层
没发现这种事,我不同电脑,IAR同一版本编译后都一样,优化等级低!

出0入0汤圆

发表于 2015-10-20 11:13:32 | 显示全部楼层
确实奇怪,试试不同时间编译两次比较下

出0入0汤圆

发表于 2015-10-20 11:23:17 | 显示全部楼层
hex文件是可以附加很多玩意的,bin才是真正下载到单片机中的玩意。
所以大家让你对比bin

出0入8汤圆

发表于 2015-10-20 11:27:58 | 显示全部楼层
zj2003 发表于 2015-10-20 09:00
回复13楼,hex不一样,bin肯定也不一样了。

你错了,不一定的。

出0入0汤圆

发表于 2015-10-20 17:11:50 | 显示全部楼层
Mark,期待结果

出0入42汤圆

发表于 2015-10-20 17:46:13 | 显示全部楼层
期待结果

出0入0汤圆

发表于 2015-10-20 17:48:02 | 显示全部楼层
使用虚拟机,都用相同的虚拟机镜像

出0入0汤圆

发表于 2015-10-20 17:51:14 | 显示全部楼层
zj2003 发表于 2015-10-20 09:00
回复13楼,hex不一样,bin肯定也不一样了。

你自己想当然了...hex不同, BIN也可能一样的

出0入0汤圆

发表于 2015-10-20 19:15:27 | 显示全部楼层
楼主是否足够了解Hex

出0入170汤圆

发表于 2015-10-20 21:10:19 | 显示全部楼层
hex不同, BIN也可能一样的

出0入0汤圆

发表于 2015-10-20 21:27:55 | 显示全部楼层
我只知道版本不同会不一样, 同一个版本的是不是一样还真没试过

出0入0汤圆

发表于 2015-10-26 21:54:28 来自手机 | 显示全部楼层
这个太正常了,估计也就是keil在不同电脑上是一样的,ti的pic的编译器同样的程序在不同电脑上生成的hex文件里面大多数数据都不一样,但是运行效果是一样的

出0入0汤圆

发表于 2015-10-27 07:59:46 | 显示全部楼层
期待结果...Hex,

出0入0汤圆

发表于 2015-10-27 08:55:14 | 显示全部楼层
本帖最后由 pisgah 于 2015-10-27 09:01 编辑

以前没注意过还有这事,好奇关注中,期待楼主的结果......

出0入42汤圆

发表于 2015-10-27 16:04:19 | 显示全部楼层
极少使用IAR,不过对楼主的问题表示关注

出0入0汤圆

发表于 2015-10-27 16:48:56 | 显示全部楼层
我敢说99.99%是楼主自己的问题!所有的东西都一样不可能出两个不同的东西

出5入4汤圆

发表于 2018-12-7 11:22:12 | 显示全部楼层
请问楼主,这个问题后来怎么解决的啊。
我现在用和谐版本的IAR7.6,同一台电脑,不同路径下完全一样的工程,编译出来的hex文件居然不一样,对应的bin文件也不一样....

出0入0汤圆

发表于 2018-12-7 13:09:36 | 显示全部楼层
没找到原因,就让大家不要用iar。有些过于武断了吧

出0入0汤圆

发表于 2018-12-8 11:41:11 | 显示全部楼层
It is almost impossible, something must be going on.

出0入0汤圆

发表于 2018-12-8 11:50:50 | 显示全部楼层
zj2003 发表于 2015-10-20 00:04
没有时间,日期之类的代码。

同台电脑更改日期时间编译2次,排除时间,日期之类的代码

出0入0汤圆

发表于 2018-12-8 21:50:39 来自手机 | 显示全部楼层
tim4146 发表于 2018-12-7 11:22
请问楼主,这个问题后来怎么解决的啊。
我现在用和谐版本的IAR7.6,同一台电脑,不同路径下完全一样的工程 ...

不一样地方多么

出5入4汤圆

发表于 2018-12-10 21:46:26 | 显示全部楼层

已经查到问题了
首先路径不一样的情况下编译同一个工程生成的烧录文件大小不一样是因为:工程代码中存在assert断言部分的__FILE___   这个宏定义(我只说我的工程代码哈),很多库函数一般都会对参数进行相关的检查,就是用的assert。尽管实际代码的参数都是正确的,但是__FILE___一旦被编译了就会把路径信息带到烧录文件里面(猜测)
解决以上问题的办法是查看assert先关代码,一般都是条件编译的,比如我这边是
#ifdef  NDEBUG
#define assert 啥都不干
#else assert  干活

那就在代码合适位置或者在IAR的工程配置里面增加NDEBUG这个宏定义就行了

其次顺便解释一下不同时间编译出来的烧录文件内容存在不一致
这个原因主要是代码中存在__DATE__   __TIME__宏定义,所以生成的烧录程序会把时间编译进去,但是这个只是影响很少几个字节内容,特别是不会对长度有影响(领导评审代码的时候一般都市rebuild all一下看看烧录程序的大小是不是一致的)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 13:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表