(资料图)
关注+星标公众号,不错过精彩内容!
今天又遇到一个坑,也没有办法,研发产品嘛,就是不断地“出坑”、“入坑”的过程。事情是这样的,我司的产品都有固件自动升级功能,上位机读取下位机版本号,然后与自身存储的固件版本号相比较,如果自身的版本号比较新,则自动给下位机升级新版本。当然上位机存储的固件是密文的,不会把明文的Bin文件放到上位机中,因此不会有安全问题。
密文固件是由研发工程师使用专用加密工具加载Bin文件加密而成。加密工具加载Bin文件后会向文件指定地址读取固件版本号,把此版本号会放到一个指定位置,随待加密的Bin一起加密,因此版本号位置需要指定位置定义。
我们的下位机芯片采用Cortex-M3内核芯片,由于我们的芯片比较特殊没有使用IAR、Keil等编译器,而是采用eclipse编译器。
首先在连接文件中,新建一个代码段info,然后在代码中,把版本号定义在info这个段中。如下面代码所示。
代码中首先定义版本号常量、然后定义了一个文件名常量,编程人员认为两个常量是连续定义,在Bin文件中肯定是顺序排放。因此只要找到info的位置就找到了版本号。这个BUG出错就出错在想当然上,以往的发布的固件版本都没有问题,这一次因为增加了一些log,再次编译时以上两个变量在Bin文件中交换了位置,加密软件加载Bin文件后取到了错误的版本号,导致加密后的文件不能自动更新,出现升级失败BUG。
虽然两个常量都定义在同一段中,但是编译器不能保证每次编译后,常量在Bin中的排列顺序。解决此问题必须把版本号放到一个单独的段中,避免版本号位置变动。