以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. 2249: Altruistic Amphibians 01背包

    Description A set of frogs have accidentally fallen to the bottom of a large pit. Their only means o ...

  2. Python3 迭代器与生成器 - 学习笔记

    可迭代对象(Iterable) 迭代器(Iterator) 定义 迭代器和可迭代对象的区别 创建一个迭代器 创建一个迭代器类 使用内置iter()函数 StopIteration异常 生成器(gene ...

  3. python2执行程序报错:NameError: name 'y' is not defined

    然后运行一直报错 这个错误,是由于版本不同造成的语法错误,在python3中,输入可以使用input,但如果你的版本是python2,那么此时input就得改成raw_input,否则你输入数据会被当 ...

  4. 字节码编程,Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一篇 Helloworld 中,我们初步尝试使用了 Javassist字节编程的 ...

  5. 一文教你快速修改ubuntu终端显示的主机名和用户名

    为了让终端的显示更加简洁,清爽,改掉显示的用户名和主机名,改成你喜欢的名字. 创作不易,如果本文帮到了您: 如果本文帮到了您,请帮忙点个赞

  6. ReactNative报错:Can't find variable: __fbBatchedBridge

    最近开始研究ReactNative,首先根据网上教程 http://www.codeceo.com/article/windows-react-native-android.html 一步一步来.完成 ...

  7. Jmeter简单性能测试练习

    项目描述: 被测网站:xqtesting.blog.51cto.com 指标:响应时间以及错误率 场景:线程数20   测试步骤: 测试计划 线程组 http请求 监听器 运行脚本 查看报告 1.添加 ...

  8. 接口(API)测试理念

    什么是接口测试 接口测试就是针对软件对外提供服务的接口的输入输出进行测试,以及接口间相互逻辑的测试,验证接口功能与接口描述文档的一致性: 测试的重点是检查数据交互.传递.和控制管理过程以及系统间的相互 ...

  9. Unsafe类初探

    Unsafe类是java中非常特别的一个类.它名字就叫做"不安全",提供的操作可以直接读写内存.获得地址偏移值.锁定或释放线程. 通过正常途径是无法获得Unsafe实例的,首先它的 ...

  10. 一、环境的安装Dev-C++

    1.https://sourceforge.net/projects/orwelldevcpp/?source=directory 2. 3. 4. 5.看到下面页面表示安装已完成啦