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. 如何发布打印机文件夹及ICA 客户端打印机配置工具
  2. Mysql多表查询(案例2)
  3. 《MySQL必知必会》所有SQL语句图表集合(可作为查询表使用)---已完结
  4. 在Android应用外获取app的签名
  5. softmax实现cifar10分类
  6. 关于keil编译cortex-m3纯汇编时为什么问题使用align地址问题
  7. Web 版 VS Code (Visual Studio Online) 即将来临!
  8. php session缓存,扫盲:php session缓存至memcached中的方法
  9. 漫画:互联网大佬都是这样聊天的
  10. Flink 端到端一致性
  11. 自定义List接口及相关方法
  12. mysql 备份恢复 asp_ASP中怎么实现SQL数据库备份、恢复!
  13. 使用iftop监控网卡实时流量
  14. 【分享】.Net有哪些大型项目、大型网站的案例?
  15. 移动开发中的基础知识总结
  16. c++面试常见问题2019-10-03
  17. 罗格斯的计算机科学,罗格斯大学计算机科学研究生申请截止日期
  18. vs2012中将图片放到resource中进行调用
  19. 直播绿幕抠图的例子(绿幕抠图直播实例参考)
  20. win10 修复打印机服务器,Win10专业版打印机无法启动print spooler服务怎么修复?

热门文章

  1. die查壳工具 使用教程
  2. c语言中五子棋怎么计时,五子棋如何计时
  3. NURBS求取basis函数的代码
  4. 间接利用微信压缩视频文件
  5. 5 个最适合 Windows的命令行/控制台替代品
  6. hrbust 哈理工oj 1588 神医【贪心】
  7. 【Django】Django+Ajax下载文件(使用FileResponse)
  8. ChainLink原理
  9. PX4控制云台的两种方式
  10. SQL语句增删改查/高级查询