以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. 李婷华 201771010113 《面向对象程序设计(java)》 第三周学习总结

    第一部分:理论知识回顾 第一章 再次了解了java“白皮书”的关键术语,java的常见术语,对于“白皮书”的关键术语依然环游不太理解的. 第二章 在使用命令行工具运行java程序的过程中,依然会有环境 ...

  2. Azure AD(二)调用受Microsoft 标识平台保护的 ASP.NET Core Web API 上

    一,引言 上一节讲到Azure AD的一些基础概念,以及Azure AD究竟可以用来做什么?本节就接着讲如何在我们的项目中集成Azure AD 包含我们的API资源(其实这里还可以在 SPA单页面应用 ...

  3. go实现SnowFlake

    package main import ( "errors" "fmt" "strconv" "sync" " ...

  4. 设计者模式之GOF23命令模式

    命令模式Command 将一个请求封装为一个对象,从而使我们可用不同的请求对客户参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.也称之为:动作Action模式,事务transaction模式 ...

  5. easytornado

    0x01 进入网站,发现3个文件 逐一查看 flag.txt url:?filename=/flag.txt&filehash=d3f3ff3f92c98f5f0ff4b8c423e1c588 ...

  6. SpringBatch异常To use the default BatchConfigurer the context must contain no more thanone DataSource

    SpringBoot整合SpringBatch项目,已将代码开源至github,访问地址:https://github.com/cmlbeliever/SpringBatch 欢迎star or fo ...

  7. 2018-08-26 jQuery与javaScript的区别及核心方法

    1.jq对象就是js new Object 生成的普通对象. 2.jq对象与js对象,他们的方法不能共用! 3.jq对象与js对象的相互转化: js对象转jq对象 -> $(js_obj);// ...

  8. 消息队列之Kafka——从架构技术重新理解Kafka

    Apache Kafka® 是 一个分布式流处理平台. 这到底意味着什么呢? 我们知道流处理平台有以下三种特性: 可以让你发布和订阅流式的记录.这一方面与消息队列或者企业消息系统类似. 可以储存流式的 ...

  9. ql的python学习之路-day9

    前言:本节主要学习装饰器 一.装饰器 定义:本质上是个函数,用来装饰其他函数:(就是为其他函数添加附加功能) 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 以上两点可以总 ...

  10. kibana 通过nginx+ldap实现登录认证

    nginx配置 使用自己搭建的openldap 使用用户中心的openldap