以Code Warrior 11生成的flash版本(FLASH.lcf)为例
 
一. 参考资料
 
安装完Code Warrior IDE之后,有一个自带的pdf帮助文件,叫做MCU_Power-Architecture_Compiler.pdf,即CodeWarrior Development Studio for Power Architecture Processors Build Tools Reference Manual。看下目录:
可谓面面俱到,整个编译过程中用到的方方面面都讲到了。通读一遍肯定大有裨益。
 
二. 链接配置文件
 
多个源代码文件编译成目标文件之后,会链接成为可执行文件。链接的过程,需要配置文件进行约束,比如哪些代码放在什么位置。嵌入式中比较明显,比如:
1. 0x0000_0000处的第一条指令,需要是复位异常处理指令;
2. 最开始的一段是中断向量表;
3. 初始化的代码需要放在最开始的4K区间,因为上电后CPU的访问空间限制在这4K里面,超出则无法访问;需要在这4K代码里面扩大CPU的访存区间;
4. 代码段、只读数据段放在flash地址区间,而可读写数据区和BSS区放在内存地址区间;
等等。
 
三. 实例
 
以CW11自动生成的FLASH.lcf文件为例。
 
1.MEMORY区间划分
 
总体划分整个地址区间,每一个区间取一个名字,然后起始地址和长度。
 
2.SECTIONS
 
接下来描述各个源文件中的代码,放在哪一个区间。
可以看到BAM即boot sector放在起始地址0处。然后是.init代码段和.init_vle代码段,存放初始化代码。其后是中断向量表。
 
代码段.text和.text_vle, .rodata段放在flash区间。注意的是.ctors和.dtors是C++的constructors和destructors即类的构造器和解构器。
 
带初始值可读写数据区.data(带初值的全局变量和静态变量)和无初值可读写数据区.bss (不带初值的全局变量和静态变量)处在内存地址区间。
这里“处在”的意思是:
a. 他们的地址是在这个区间,以这个区间的地址被引用;
b. 他们在可执行文件或者生成的image中的偏移量跟这个地址不对应;不可能生成一个image文件,从internal_flash结尾到0x4000_0000中间填充0,然后开始填充.data区;
 
问题来了,.data和.bss区存在两个地址:存在flash中的地址和存在内存中的地址。我们需要记录这两个起始地址和区间长度,在上电初始化时:
a. 从flash中拷贝.data区到内存中;
b. 把内存中.bss区清零;注意flash中不需要存放全部.bss区,因为没有带初始值,所以只需要记录起始地址和长度即可;这是其与.data不同的地方;
 
PS. 为什么有.data/.sdata/.sdata2和.bss/.sbss/.sbss2,这么多data区和bss区,这是ABI决定的。
 
3.堆和栈
 
堆和栈的区间在MEMORY中已经定义了。这里定义代码需要的变量,链接器会生成这些值并填充到代码中。
 
在初始化时,根据ABI,填充_stack_addr到Stack Pointer Register(r1/gpr1)。因为栈向下生长,所以_stack_addr加上了SIZEOF(stack),为高地址。
_heap_addr没有用拿到?ABI里面没有规定?调用malloc分配内存时即是从堆中分配,这个地址在这里用到,在库中引用:
 
三. CW生成image的注意事项
 
1. Linker生成了很多符号,参考__ppc_eabi_linker.h:
 
2. Linker需要-romaddr参数才会正确生成.data在flash中的地址:
 
 
 

PowerPC-Link Command File解析的更多相关文章

  1. 详解BLE 空中包格式—兼BLE Link layer协议解析

    BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题. 虽然BLE空中包(pa ...

  2. Linux Command Line 解析

    Linux Command Line 解析 0 处理模型 Linux kernel的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line进行配置的.在进行后续分析之前,先 ...

  3. 对Link Map File的初步认识

    什么是Link Map File Link Map File中文直译为链接映射文件,它是在Xcode生成可执行文件的同时生成的链接信息文件,用于描述可执行文件的构造部分,包括了代码段和数据段的分布情况 ...

  4. linux command>file 2>&1 & 命令详解

    command>file >& & 命令的最后一个&表示把该命令以后台的job的形式运行 一个命令的执行伴随着三种输入输出 标准输入(stdin):默认指向键盘的输 ...

  5. 模板函数(template function)出现编译链接错误(link error)之解析

    总的结论:    将template function 或者 template class的完整定义直接放在.h文件中,然后加到要使用这些template function的.cpp文件中. 1. 现 ...

  6. linux command file/type which/whereis

    今天遇到几个命令,初见时感觉好像啊,不太能区分其具体功能和区别,因此特来记录一下. 1. file和type file: 查看文件类型 type: display information of com ...

  7. 使用jQuery解析xml时command节点解析失败

    jQuery版本1.8.3 待解析的xml为: <message><user><command>Login</command></message& ...

  8. 【原创】大数据基础之Logstash(3)应用之file解析(grok/ruby/kv)

    从nginx日志中进行url解析 /v1/test?param2=v2&param3=v3&time=2019-03-18%2017%3A34%3A14->{'param1':' ...

  9. shell中的>,2>&1,&>file 解析记录

    0  表示标准输入1  表示标准输出2  表示标准错误输出>  默认为标准输出重定向,与 1> 相同2>&1  意思是把 标准错误输出 重定向到 标准输出.&> ...

随机推荐

  1. LateX公式表

    转载自xkgjfl 话说为什么LateX公式这么难记 markdown最全数学公式 我们在用markdown写文档时有时候少不了需要插入一些公式,然而markdown公式输入远没有word这么直观,有 ...

  2. SpringCloudStream学习(三)RabbitMQ中的惰性队列

    ​ 从RabbitMQ 3.6.0之后,有了 Lazy Queues 的概念-一个会尽早的将队列中的内容移动到磁盘的队列,并且只有当消费者需要的时候,才会将它们加载到内存中 ​ 惰性队列设计的一个主要 ...

  3. 嫌弃Apriori算法太慢?使用FP-growth算法让你的数据挖掘快到飞起

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第20篇文章,我们来看看FP-growth算法. 这个算法挺冷门的,至少比Apriori算法冷门.很多数据挖掘的教材还会 ...

  4. MySQL 查询当天、本周,本月、上一个月的数据

    mysql查询当天的所有信息: SELECT * FROM 表名 WHERE year(时间字段名)=year(now()) and month(时间字段名) = month(now()) and d ...

  5. Navicat15 for Mysql激活教程

    1.下载Navicat Premium Navicat15链接:http://www.navicat.com.cn/download/navicat-premium,选择相应版本,这里选择window ...

  6. java ->IO流_字节流

    字节流 在前面的学习过程中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现在我们就要开始给文件中写数据,或者读取文件中的数据. 字节输出流OutputStream OutputStre ...

  7. 2018-06-19 Javascript 基础2

    js变量类型测试:typeof()->五种 (number,string,boolean,object,undefined): instanceof->检查某个对象是否是某个构造器产生的 ...

  8. ruoyi-plus-server(一):引入Mybatis-Plus

    背景:著名开源管理系统ruoyi-vue是基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统(https://gitee.c ...

  9. React:Conditional Rendering(条件渲染)

    就像JS中常常会根据条件(比如if/else.switch)返回不同的值,React中也可以根据组件的状态或其他参考条件返回不同的React Element. 比如根据用户是否登陆渲染对应的UI面板. ...

  10. 微信小程序入门知识点总结

    微信小程序入门知识点总结 前情介绍 ​ 微信小程序就不多介绍了,我们想要开发微信小程序首先得到微信公众平台 下方的小程序处注册相关账号并登录,接着填写小程序相关资料.在设置处可找到AppID用以开发微 ...