仅仅用于自己学习做笔记使用,总结很不全。

1, .text, .bss, .data, .rodata, stack and heap
.text code
.data global and static init variable, 即占文件空间,又占用运行时内存空间的
.bss uninit global and static variable只占运行时的内存空间,而不占文件空间
.rodata const data
Stack local variable and param
Heap malloc

2, link script

MEMORY
{flash (rx) : ORIGIN = 0x00000000, LENGTH = 448Ksram (rwx) : ORIGIN = 0x21004000, LENGTH = 176K
}
//flash (rx) 标记为flash,该部分是可读可执行,//ORIGIN标记该部分存储的起始地址
//LENGTH
ENTRY(_stext)                       //通常ENTRY()表示的是entry function
SECTIONS
{.text : {_stext = ABSOLUTE(.);        //获取.text section 的起始地址(当前的绝对地址)KEEP(*(.vectors))               //保留.vectors的部分,将其链接进.text section中/* explictly specify the offset of link tags */. = 0x400;                            //将当前的地址定位符设置为0x400/* image magic */LONG(0x21494350)            //设置image的header magic,用于image的checkLONG(_stext)LONG(_eflash - _stext)LONG(__start)*(.text .text.*)                      //将所有.text 以及 .text.*的数据放到.text section中*(.fixup)*(.gnu.warning)_srodata = ABSOLUTE(.);        //标记rodata的起始地址*(.rodata .rodata.*)_erodata = ABSOLUTE(.);     //标记rodata的结束地址*(.gnu.linkonce.t.*)*(.glue_7)*(.glue_7t)*(.got)*(.got)*(.gcc_except_table)*(.gnu.linkonce.r.*)_etext = ABSOLUTE(.);        //获取.text section 的结束地址} > flash.init_section : {                            //自己定义的section,用于将我们定义的用init_section标记出来的都放入到 .init_section 段中。_sinit = ABSOLUTE(.);KEEP(*(.init_array .init_array.*))      //不管该函数有没有被调用,都要保留该部分,不允许优化掉_einit = ABSOLUTE(.);} > flash.ARM.extab : {*(.ARM.extab*)} > flash__exidx_start = ABSOLUTE(.);.ARM.exidx : {*(.ARM.exidx*)} > flash__exidx_end = ABSOLUTE(.);_eronly = LOADADDR(.data);.data : {_sdata = ABSOLUTE(.);*(.data .data.*)*(.gnu.linkonce.d.*)CONSTRUCTORS_edata = ABSOLUTE(.);} > sram AT > flash
// > sram AT > flash的含义是.data的运行区是在sram上,但是它的LMA是在flash上,当你使用的时候,你需要将其从flash上拷贝到sram中。_eflash = LOADADDR(.data) + SIZEOF(.data);.noload (NOLOAD) : {*(.dma .dma.*)*(.ram_vectors .ram_vectors.*)} > sram.bss : {_sbss = ABSOLUTE(.);*(.bss .bss.*)*(.gnu.linkonce.b.*)*(COMMON). = ALIGN(8);_ebss = ABSOLUTE(.);} > sram_eheap = _sdumplog;      //heap区的结束地址是dump log的起始地址_sdumplog = _edumplog - _dumplogsize;_edumplog = ORIGIN(sram) + LENGTH(sram);_dumplogsize = 4096;//对于我们来说,我们用sram的最后4K做dump log使用用原始的nuttx上的样例:
nuttx\boards\arm\c5471\c5471evm\scripts\ld.script
OUTPUT_ARCH(arm)        //声明处理器的架构
ENTRY(_stext)                   //通常ENTRY()表示的是entry function
SECTIONS
{/* Interrupt vector trampoline and command line parameters* are provided in IRAM by the rrload bootloader.  Vectors will be* copied into _svectors.*/. = 0xffc00000;              //将当前的地址定位符设置为0xffc00000_svectors = ABSOLUTE(.);       //获取当前的起始绝对地址/* These are locations in IRAM where the rrload bootloader passes* information to the running program*/. = 0xffc00020;    //将当前的地址定位符设置为0xffc00020__KernCommandLineMagicStr = .;  /* magic pattern string == "kcmdline-->" */. = 0xffc0002C;                 /* advance to .+strlen("kcmdline-->")+1 */ //将当前的地址定位符设置为0xffc0002C__KernCommandLineOverride = .;  /* location of kernel command line string */. = 0xffc00100;__EtherMACMagicStr = .;         /* magic pattern string == "etherMAC-->" */. = 0xffc0010C;                 /* advance to .+strlen("etherMAC-->")+1 */__EtherMAC = .;/* The OS entry point is here */. = 0x10300000;.text : {_stext = ABSOLUTE(.);     //获取.text section的起始绝对地址*(.text)*(.fixup)*(.gnu.warning)*(.rodata)*(.glue_7)*(.glue_7t)*(.got)                    /* Global offset table */_etext = ABSOLUTE(.);   //获取.text section的结束绝对地址}_eronly = ABSOLUTE(.);          /* See below */. = ALIGN(4096);          //设置当前地址按照4096的大小去做对齐的处理.data : ALIGN(4) {  //.data 的数据按照4 字节大小对齐的方式做数据排布。_sdata = ABSOLUTE(.);                 //获取.data section的开始绝对地址*(.data)CONSTRUCTORS. = ALIGN(4);_edata = ABSOLUTE(.);                //获取.data section的结束绝对地址}.bss : ALIGN(4) {               /* BSS */_sbss = ABSOLUTE(.);*(.bss)*(COMMON). = ALIGN(4);_ebss = ABSOLUTE(.);}

3,How to use variable in link script
Hence when you are using a linker script defined symbol in source code you should always
take the address of the symbol, and never attempt to use its value. For example suppose
you want to copy the contents of a section of memory called .ROM into a section called
.FLASH and the linker script contains these declarations:
start_of_ROM
= .ROM;
end_of_ROM
= .ROM + sizeof (.ROM) - 1;
start_of_FLASH = .FLASH;
Then the C source code to perform the copy would be:
extern char start_of_ROM, end_of_ROM, start_of_FLASH;
memcpy (& start_of_FLASH, & start_of_ROM, & end_of_ROM - & start_of_ROM);

nuttx link script相关推荐

  1. 如何禁用Visual Studio 2013的Browser Link功能

    为什么80%的码农都做不了架构师?>>>    VS2013新增的Browser Link功能虽然"强大",但我并不需要. 但默认是开启的,会在页面中自动添加如下 ...

  2. Linux Kernel系列三:Kernel编译和链接中的linker script语法详解

    先要讲讲这个问题是怎么来的.(咱们在分析一个技术的时候,先要考虑它是想解决什么问题,或者学习新知识的时候,要清楚这个知识的目的是什么). 我在编译内核的时候,发现arch/arm/kernel目录下有 ...

  3. Java0x800000000什么意思_Linux Kernel编译和链接中的linker script语法详解

    先要讲讲这个问题是怎么来的.(咱们在分析一个技术的时候,先要考虑它是想解决什么问题,或者学习新知识的时候,要清楚这个知识的目的是什么). 我在编译内核的时候,发现arch/arm/kernel目录下有 ...

  4. 推荐一个HTML的语法高亮解析器

    http://code.google.com/p/syntaxhighlighter/wiki/Languages 支持高亮的语法如下 Language Aliases C++ cpp, c, c++ ...

  5. 浏览器加载、解析、渲染的过程

    最近在学习性能优化,学习了雅虎军规 ,可是觉着有点云里雾里的,因为里面有些东西虽然自己也一直在使用,但是感觉不太明白所以然,比如减少DNS查询,css和js文件的顺序.所以就花了时间去了解浏览器的工作 ...

  6. 程序员的自我修养--链接、装载与库笔记:Windows下的动态链接

    Windows下的PE的动态链接与Linux下的ELF动态链接相比,有很多类似的地方,但也有很多不同的地方. 1. DLL简介 DLL即动态链接库(Dynamic-Link Library)的缩写,它 ...

  7. 程序员的自我修养--链接、装载与库笔记:静态链接

    1. 空间与地址分配 对于链接器来说,整个链接过程中,它就是将几个输入目标文件加工后合并成一个输出文件.测试代码a.c和b.c内容如下: // a.c extern int shared;int ma ...

  8. java使用uploadify上传文件

    一.简介 Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示:可以上传多个文件: 详细的使用方法网上有很多,建议到官网参考,这里仅仅展示其使用的效果: 官网:www.upl ...

  9. 从零开始学_JavaScript_系列(14)——dojo(7)(饼图,BorderContainer,hashchange,弹窗)...

    5/5更新.BorderContainer自适应在本地时正常使用的方法,请查看原文代码之前那一段话 (60)创建一个饼形图 比较简单的标签声明法:(只需要修改数据即可) ①首先,加载dojo文件和样式 ...

最新文章

  1. ZZ: How to remove 'Open in Windows Explorer' from the 'Actions Menu'
  2. outlook 单独安装_民强村排烟管道安装公司
  3. html3d旋转发光立方体,纯css3实现的3D立体动态旋转立方体特效
  4. python 函数可以作为容器对象的元素_python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义...
  5. 嵌入式linux开发业内各个常用开源项目git仓库地址大全
  6. 诺基亚首款Windows Phone智能手机将在年内推出
  7. 【渝粤教育】国家开放大学2018年春季 3780-22T燃气设备操作与维护 参考试题
  8. windows永久添加路由
  9. Python3 格式化数字 补零 数字补零
  10. 修复VSS 2005
  11. 怎么讲计算机屏幕录制,屏幕录制软件怎么用?教你2种屏幕录制方法
  12. JavaScript学习笔记
  13. 洛谷试炼场---提高历练地2
  14. 博弈论——扩展式博弈(Extensive Game)
  15. 谷歌地图坐标转换为百度地图坐标
  16. 第二十次CCF CSP认证考试经验
  17. 写给准备找工作的同学们(阿里巴巴面试流程)
  18. 迭代收缩阈值算法matlab,一种基于自适应快速迭代收缩阈值算法的图像处理方法与流程...
  19. python自动下载小说
  20. 博睿APM获《金融电子化》2021年金融业新技术应用创新突出贡献奖

热门文章

  1. Vue 服务端渲染(SSR)、Nuxt2 - 从入门到实践
  2. SiC模块ASC800N1200DCS12(丹弗斯DCM)助力高速发展的纯电动汽车 (BEV)、插电式混合动力汽车 (PHEV) 和混合动力汽车 (HEV)
  3. 五菱4s店维修记录怎么查?
  4. LYSoft站点改版
  5. 分享21个JS抽奖转盘特效,36个JS表单验证,31个JS进度条,总有一款适合您
  6. 2020CCPC威海 J - Steins;Game (sg函数、线性基)
  7. 浅谈关于BPM的那些事
  8. 阿里云OSS后台实现远程文件上传下载
  9. python写的定时播放音乐
  10. Nginx 配置https证书