1.1     __main()代码执行分析

以keyled程序为例说明,keyled代码请参考我的博客网址:http://my.csdn.net/wfq0624/code/detail/7645

程序经过汇编启动代码,执行到__main()后,可以看出有两个大的函数:

__scatterload():负责把RW/RO输出段从装载域地址复制到运行域地址,并完成了ZI运行域的初始化工作。

__rt_entry():负责初始化堆栈,完成库函数的初始化,最后自动跳转向main()函数。

分析__scatterload()函数

执行到__main(),先跳转到_scatterload下图红框框中代码所示,执行完后,R10和R11就被赋给成了下面两个值。

Map文件中的symbol

Region

TableTable

Base               0x00000394   Number         0 anon

obj.o(Regionobj.o(Region

Table)

Region

TableTable

Limit               0x000003b4   Number         0 anon

obj.o(Regionobj.o(Region

Table)

然后执行_scatterload_null代码,将R10对应地址存放的的4个字copy到R0~R3中,可以看出

R0:0x1000表示的是keyled.o加载域起始地址

R1:0x30000100为keyled.o运行域地址

R2:0X160为copy的大小,keyled.o的大小从map文件中得知就是0x160 Byte

R3:0X1E4 是_scatterload_copy 代码的起始地址,实用BXR3 就能跳转到_scatterload_copy来复制代码。

跳到_scatterload_copy,开始copy,循环0x16次,每次搬移4个字(16Byte),共搬移0x16*0x10=0x160

复制完keyled.o代码后,进一步循环到_scatterload_null准备好,ZI段需要清零的地址和范围

执行完这个循环后

R1:0x30050000 为ZI段的起始地址

R2:0x618为ZI段大小,换成十进制是1560.从map文件得知ZI大小就是1560Byte

R3:0x20c 为_scatterload_zeroinit 的地址

执行下面红框框中循环体,共清零0x610Byte范围,然后再执行蓝框框中代码,清零8Byte,总共0x618

ZI段清零(0x30050000~0x30050618)

然后使用BX R14跳转到0x000001BC处,顺序执行到BL  __rt_enty 指令

成功跳转到__rt_enty函数

分析__rt_entry()函数

先调用__user_setup_stackheap()函数来建立堆栈

可以看出在这个函数中,会执行到BL__user_initial_stackheap()函数,这样也就明白了,为什么使用分散加载文件,需要设置__user_initial_stackheap这个函数来设置堆栈空间。

原文出处:点击打开链接https://blog.csdn.net/wangfoquan/article/details/7650988

MDK_main()代码执行过程分析相关推荐

  1. Ansible执行过程分析、异步模式和速度优化

    Ansible系列(七):执行过程分析.异步模式和速度优化 分类: Linux服务篇 undefined 我写了更完善的Ansible专栏文章:一步到位玩儿透Ansible Ansible系列文章:h ...

  2. 4. 系统调用执行过程分析

    ##################################### 作者:张卓 原创作品转载请注明出处:<Linux操作系统分析>MOOC课程 http://www.xuetang ...

  3. ART运行时Semi-Space(SS)和Generational Semi-Space(GSS)GC执行过程分析

    Semi-Space(SS)GC和Generational Semi-Space(GSS)GC是ART运行时引进的两个Compacting GC.它们的共同特点是都具有一个From Space和一个T ...

  4. thinkphp5+远程代码执行_ThinkPHP5 5.0.23 远程代码执行漏洞

     漏洞描述 ThinkPHP是一款运用极广的PHP开发框架.其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程 ...

  5. linux内核远程漏洞,CVE-2019-11815:Linux内核竞争条件漏洞导致远程代码执行

    *本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. 运行了Linux发行版的计算机设备,如果内核版本小于5.0.8的话,将有可能受到一 ...

  6. WSS 代码执行的权限提升

    WSS 代码执行的权限提升 概述: WSS 默认使用身份模拟执行代码,也就是说用当前登录的用户身份执行Web Part或者自定义应用程序的代码访问.在大多数情况下,这种机制能够准确并严格地控制了标准权 ...

  7. ElasticSearch Groovy脚本远程代码执行漏洞

    什么是ElasticSearch? 它是一种分布式的.实时性的.由JAVA开发的搜索和分析引擎. 2014年,曾经被曝出过一个远程代码执行漏洞(CVE-2014-3120),漏洞出现在脚本查询模块,由 ...

  8. Linux包管理器apt/apt-get发现远程代码执行漏洞

    研究人员Max Justicz日前发现了知名Linux包管理器apt/apt-get中的远程代码执行漏洞,该漏洞允许外部进行中间人攻击并获取root权限以执行任何代码.该漏洞已在最新版本apt修复,如 ...

  9. php5.3.8添加eaccelerator扩展 加速php代码执行效率

    安装eaccelerator [root@localhost ~]# wget http://nchc.dl.sourceforge.net/project/eaccelerator/eacceler ...

最新文章

  1. rsync实现linux间同步
  2. 如何将adb shell里面查到的文件复制到本地电脑
  3. 【大学课程】数据结构知识点
  4. mysql yintint类型_MySQL服务器2 被嫌弃的胖子
  5. 【python】pycharm启动 一直index,无法运行
  6. rust笔记9 错误处理
  7. php自动加载 依赖,php自动加载
  8. 51单片机LCD12864程序移植到STM32F103C
  9. HeadFirstJava 4,5,6
  10. 阵列信号处理 窄带信号与包络
  11. 魔兽争霸如何修改快捷键
  12. 微擎修改服务器域名,微擎服务器ip地址修改
  13. 《管理长歌行》——青蛙与蜘蛛的对话
  14. Python爬取《少年的你》豆瓣短评
  15. C语言函数大全-- r 开头的函数
  16. Unity动态加载3D模型
  17. 如何进行创新流程的前端管理?
  18. 数字IC设计实现hierarchical flow之物理验证篇
  19. ESP32在电池供电时用ULP监测电池电压
  20. React从入门到入土

热门文章

  1. Axure8.0深入一点(篇)
  2. 【面试必备】javascript操作DOM元素
  3. 疯了吧!面试官 5 连问一个 TCP 连接可以发多少个 HTTP 请求?
  4. 面试必备:缓存穿透,缓存雪崩的四种解决方案
  5. 北上广Java开发月薪20K往上,该如何做,需要会写什么
  6. 【Python】青少年蓝桥杯_每日一题_7.19_电梯用量
  7. 第九届蓝桥杯java B组—第六题递增三元组(详细介绍)
  8. linux内置变量大全,Linux进阶之bash编程四(内置变量)
  9. iphone11计算机出现问题,苹果11出现死机现象
  10. 接口java_JAVA 初识接口