一线研发之声: keil uvision4默认scat文件的重大隐患

[复制链接]
 楼主| sedatefire 发表于 2012-8-31 00:41 | 显示全部楼层 |阅读模式
本帖最后由 sedatefire 于 2013-7-6 14:33 编辑

本文描述一个keil uvision4在链接环节的重大隐患,会导致栈溢出,覆盖了用户全局变量空间。Cortex M3和M0系列这几年迅猛发展,相信使用M3和M0的工程师也不少了,诸位如果遇到系统变量莫名被修改的话,不妨来看看是否这个原因。

以STM32F103xx的一个scat档为例,keil默认的链接写法如下
。。。。




本文提纲如下
一.keil默认scat档分析
1.指出其栈空间的分配,紧挨在系统变量区域后面。
scat文件如下


map部分内容如下


2.栈如果分配不够,编译器是不会报警的,这不像c51那样是静态分析。
一个栈溢出的编译结果
c51的静态分析

3.栈的地址是压栈递减的,很容易就“溢出”覆盖系统变量区域的。
栈递减的测试代码如下,证明...

悄悄覆盖系统变量的代码如下,看map分析


二、提出DIY的scat档写法,将栈的空间放到芯片型号ram空间的最后面即可。
把栈隔开

三、keil编译器为何这样做的原因猜想。
为了通用,因为每一个M3的mcu的RAM空间大小都是不同的,无法做到面面俱到。


PS:未接贴,一直提醒,赶快过来重新编辑下

其实就是一句话,M3的官方程序在跳转之前,对栈指针进行了初始化。
这个初始化的值,填得不妥,会导致系统崩溃。
因为跳转的时候,还执行了pop指令。
在满足xxx的条件下,就会出现指针地址溢出,非法,导致总线错误,系统当机。
为了解释这个事情,我得交代好多基础知识给新手啊。


 楼主| sedatefire 发表于 2012-8-31 00:44 | 显示全部楼层
哈,闪人啦,明晚回来续写
赶在八月前,看看能不能领到版主奖
呵呵,求31号24时前,给条裤子...嘻嘻
linqing171 发表于 2012-8-31 07:22 | 显示全部楼层
同意一条,就是一里面的2,其他的没有注意。
dlyt_test001 发表于 2012-8-31 08:25 | 显示全部楼层
顶,学习一下!
我一般用默认的配置!
huangqi412 发表于 2012-8-31 08:53 | 显示全部楼层
占座
 楼主| sedatefire 发表于 2012-8-31 09:46 | 显示全部楼层
今天没迟到,抽空来瞄一下,顺便顶上去
晚上续写...
戒指320 发表于 2012-8-31 13:15 | 显示全部楼层
等待楼主 继续讲课
lixupengarm 发表于 2012-8-31 15:43 | 显示全部楼层
没注意
雷影少年 发表于 2012-8-31 15:55 | 显示全部楼层
期待楼主的新作
gtekled 发表于 2012-8-31 17:13 | 显示全部楼层
栈的地址是压栈递减的
misra 发表于 2012-8-31 20:00 | 显示全部楼层
关注。。。。
Wxy8030 发表于 2012-8-31 21:26 | 显示全部楼层
看看结果!
[惊涛骇浪] 发表于 2012-8-31 21:41 | 显示全部楼层
嘿嘿,楼主热心人啊
[惊涛骇浪] 发表于 2012-8-31 21:41 | 显示全部楼层
嘿嘿,楼主热心人啊
戒指320 发表于 2012-8-31 23:07 | 显示全部楼层
我再来看,楼主你啥时候讲。
 楼主| sedatefire 发表于 2012-9-1 00:52 | 显示全部楼层
哎 每天去公司再搞搞...
家里找不到资料来当例子
雷影少年 发表于 2012-9-1 07:36 | 显示全部楼层
没事~
咱有时间等
原野牧歌 发表于 2012-9-1 15:31 | 显示全部楼层
看看大侠怎么分析问题……
sanliu85 发表于 2012-9-1 15:34 | 显示全部楼层
持续关注中。。
FutureDeveloper 发表于 2012-9-1 17:05 | 显示全部楼层
Mark!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4393

主题

5935

帖子

34

粉丝
快速回复 在线客服 返回列表 返回顶部