linker主要完成的工作:
        重定位:目标模块被创建时假设的目标地址都从0开始,linker把同名的section合并起来,然后为各个section规划run-time时刻的地址。linker假设run-time时刻的开始地址也是从0开始。
        符号解析:处理多个模块之间符号的引用。

loader主要完成的工作:
        程序加载:linker生成的可运行文件(如ELF, COFF)中,已经包含了各个section的运行地址、在文件中的位置(offset)和section的属性(read, write等)等信息,loader根据这些信息将各个段拷贝到指定的内存中准备运行。
        重定位:loader在加载时有可能进行再一次重定位,最终确定程序在run-time时刻的绝对地址。注意linker总是假设run-time空间是从0开始的。

x86与单片机之间linker和loader的不同:
        对于x86与mcu,linker的作用基本是一样的,但loader有较大不同。在x86中,loader就是从外存(如硬盘)中将可执行文件的各个段拷贝或map的内存中,但对于单片机有几点不同:一是很多都是裸机运行的,根本没有loader;二是很多情况下代码是直接在flash或rom中运行的,不需拷贝,只有已初始化数据段需要拷贝到ram中,未初始化数据段则清0;第三,elf和coff格式是有文件头的,文件最开头并非指令,而单片机一般是从0地址开始执行,所以在没有loader的情况下,elf或coff直接烧入flash或rom是无法运行的。

没有了loader,那么loader该做的这些事由谁来做呢?答案是,对于第二点,编译器会加入startup代码来完成这些事情。例如PIC的编译器PICC,会在c代码中加入一段"run-time startup"代码,来完成拷贝数据和清零RAM的工作。这段代码在picc的source目录的picrt66x.as文件中。对于第三点,一般是由hex转换工具来将elf或coff转换成hex文件,hex转换工具相当于做了部分loading的工作,根据section的run-time地址来安排程序烧写在flash中的地址。当然比实际loading要简单,因为hex文件本身可以指定烧写的地址。这样一来,烧写到flash或rom中的程序,就是已经完成了一半loading的了。对于代码段,就是已经ready to run了,而对于数据段,就用前面第二点的方法来完成加载。

对于TI的c6000系列,因为支持多种启动方式(ROM,HPI等),好象ccs并没有自动加入startup代码来做这些loader的工作,必须要自己写一段loader代码加入project中。

linker与loader,x86与单片机相关推荐

  1. 【腾讯Bugly干货分享】Android Linker 与 SO 加壳技术

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57e3a3bc42eb88da6d4be143 作者:王赛 1. 前言 Andr ...

  2. STM32F103VCT6单片机实现秒表功能

    1.实验器材:STM32F103VCT6单片机 2.基于STM32的嵌入式软件开发流程 在魔方按钮中导入所需要用到的.c源文件,并在魔术棒按钮中的C++栏目中INCLUDES所要用到的头文件的文件夹, ...

  3. linker 链接脚本

    linker 链接器主要有两个作用: 一是将若干输入文件(.o文件)根据一定规则合并为一个输出文件(例如ELF格式的可执行文件): 一是将符号与地址绑定(当然加载器也要完成这一部分工作). 关于链接器 ...

  4. linux内存实际占用分析

    作者: 黄永兵/译 出处:51CTO.com 阅读提示:本文是为那些经常疑惑的人准备的,"为什么一个简单的KDE文本编辑器要占用25M内存?"导致大多数人认为许多Linux应用程序 ...

  5. cfile清空文件内容_编译-链接-加载 :ELF文件格式解析

    摘要:对于C++的初学者,经常在程序的编译或者加载过程中遇到很多错误,类似undefined reference to ... 和 GLIBCXX_3.4.20 not found 等.这些错误都涉及 ...

  6. 编程高手必学的内存知识01:深入理解虚拟内存

    目录 1 物理内存 1.1 物理内存概述 1.2 直接使用物理内存的问题 1.2.1 多进程地址布局困难 1.2.2 进程地址空间小 1.2.3 程序链接不统一 2 虚拟内存 2.1 引入虚拟内存的目 ...

  7. [转]Linux下的动态连接库及其实现机制

    摘 要:本文介绍了动态连接库的优点,详细阐述了x86体系结构上Linux系统的编译器 .连接器.加载器如何使用多种重定位方式来实现该功能 关键词:动态连接库:Linux:重定位 The Impleme ...

  8. SRS4.0源码分析-序言

    <SRS4.0源码分析>专栏,会从 configure(配置),makefile(编译规则),main (入口函数), 带你一步一步了解 SRS 的主干代码逻辑. 这里分享一个本人阅读开源 ...

  9. ARM 之 Keil 项目/生成的各种文件类型(.AXF、.D、.crf、.exf)说明

    Keil 是ARM推出(收购)的针对Cortex-M系列等低功耗芯片芯片的集成开发环境的品牌名称.目前 Keil 的最新版本为 µVision5.旧版本的Keil目前使用的已经非常少了,当前使用主要以 ...

最新文章

  1. Linux统计行数命令wc(转)
  2. 房住不炒,来真的了?
  3. 使用git提交到github,每次都要输入用户名和密码的解决方法
  4. 我是如何用Worktile进行敏捷开发的
  5. OpenStack云第五天
  6. 微软2013年校园实习生招聘笔试题及答案
  7. ie插件获取dom_读书笔记《DOM编程艺术》DOM
  8. javabean连接mysql数据库,jsp+javabean 链接 mysql 数据库
  9. 信息学奥赛一本通(1204:爬楼梯)
  10. Linux之telnet命令
  11. java lua脚本_在Java中使用Lua脚本语言
  12. 学习进度2012-6-26(动态规划算法、Prim算法、Dijkstra算法)
  13. git 怎么回退已经push的版本_git push 操作代码回退
  14. WXSS-WXML-WXS
  15. 专题导读:数据驱动的软件智能化开发
  16. 省略to的动词不定式八种情况
  17. Netty介绍与实战(三)之粘包拆包
  18. 微信小程序云开发项目-个人待办事项-02今日模块开发
  19. 计算机网络 之 网络应用
  20. 小技巧助你解决div+css网页内容显示不完整

热门文章

  1. 关于装配体有限元分析概述
  2. 观察者模式---英雄联盟
  3. 前端实现点击弹出视频展示模块
  4. 【stata】stata软件将excel转换成.dta数据
  5. AIGC浪潮来袭,奇点云“数智科技大会”洞见AI加速的数智未来
  6. Cloudpods Golang实践
  7. 基于jquery+php+mysql 制作 仿google日历记事
  8. Unix高级安全设置
  9. html5可视化编辑器教程,html5可视化编辑器sx html5 vip使用教程(附vip账号)
  10. 郑强教授相关语录(转)