GNU链接脚本使用

链接脚本主要作用是描述输入文件的section是如何映射到输出文件的内存布局中。通俗的讲法就是编译完成后的各个obj文件,按照哪种顺序放与bin的哪个地址中;同时将运行时变量符号与VMA关联。

主要参考了下边几个博客:

1. 链接脚本的 __attribute__ 属性

2. GNU-ld链接脚本浅析

使用案例

1. 将变量或函数存放在用户定义的区域

主要目的是可以将变量或函数,运行时链接到用户定义的区域中,比如SRAM,某些CPU比直接放在FLASH中运行快(不一定,比如STM32,片内FLASH在ICODE总线上,指令预取功能使能将实现类似多级流水线的操作,SRAM则不再ICODE上,需要 "取指->译码->执行"无法加速。

主要使用链接脚本语法有:

MEMORY命令定义存储区域,通过输出section描述的 >REGION 显式的将该段限定到具体的存储区域。 如下:最后的区域为stm32f746ng最后64k,用来存放测试的变量。

MEMORY

{

RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 320K

FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 960K

USER_AREA(rx) : ORIGIN = 0x80F0000, LENGTH = 64K

}

在链接脚本的SECTIONS 段内添加下列描述:

_siusrdata = LOADADDR(.usrdata); /* LOADADDR描述了.usrdata段的LMA,可在程序中声明:extern char _siusrdata; 使用时只能只用_siusrdata的地址:char *src = &_siusrdata; src实际等于0x80F0000*/

.usrdata :

{

. = ALIGN(4);

_susrdata = .; /* create a global symbol at usrdata start;VMA地址*/

*(.usrdata) /* .usrdata sections */

*(.usrdata*) /* .usrdata* sections */

. = ALIGN(4);

_eusrdata = .; /* define a global symbol at usrdata end */

} >RAM AT> USER_AREA

主程序中在声明处使用 attribute属性声明section, 使用extern 声明链接脚本中的变量:

int data_usrarea __attribute__((section(".usrdata"))) = 6666 ;

extern char _siusrdata,_susrdata,_eusrdata;

使用时:

printf("usrarea LMA = %X, VMA = %X\r\n", &_siusrdata, &_susrdata);

printf(usrdata addr = %X, value=%d\r\n", &data_usrarea,data_usrarea);

打印结果如下:

usrarea LMA = 80F0000, VMA = 20000070

usrdata addr = 20000070, value=-536140031

地址是对的,但是value怎么是错的,实际是因为,我们自定义的区域并沒有自己将数据加载到正确的VMA地址。而系统默认的.data区域是由系统启动时加载的,不同的工程实现方法不同,如stm32 cubumx 生成的makefile工程中是这样做的

Reset_Handler:

ldr sp, =_estack /* set stack pointer */

/* Copy the data segment initializers from flash to SRAM */

movs r1, #0

b LoopCopyDataInit

CopyDataInit:

ldr r3, =_sidata

ldr r3, [r3, r1]

str r3, [r0, r1]

adds r1, r1, #4

LoopCopyDataInit:

ldr r0, =_sdata

ldr r3, =_edata

adds r2, r0, r1

cmp r2, r3

bcc CopyDataInit

ldr r2, =_sbss

b LoopFillZerobss

这段汇编的目的就是加载.data区至SRAM中,即已初始化的全局变量区。我们也可以在汇编中添加自己的代码,但是最好还是在main函数中去实现不破坏原有文件的完整性。

char *srcdata_ptr = &_siusrdata;

char *dstdata_ptr = &_susrdata;

while(dstdata_ptr < &_eusrdata)

{

*dstdata_ptr++ = *srcdata_ptr++;

}

添加上述代码完成.usrdata区域从 LMA处加载到VMA处,以后就可以快乐的运行了,打印信息如下。

usrarea LMA = 80F0000, VMA = 20000070

usrdata addr = 20000070, value=6666

思考,有了这个功能,实际上我们可以将程序分段更新,如定义一些配置参数存放在特定区域,然后在更新时可以直接这个区域更新。更加灵活的完成在线升级。

java中的导入gnu,GNU链接脚本使用相关推荐

  1. java中Excel导入,下载模板,附带前端展示

    java中Excel导入,下载模板,附带前端展示 后台下载模板代码 /*** 多个模板下载*/@RequestMapping(value = "/downloadExcel", m ...

  2. java中word导入数据库

    java中word导入数据库 前言 > word导入到数据库主要是对word的解析,word分为2003版.2007版以上,还有xml格式的,2003和2007以上的主要是对单元格内容进行判断, ...

  3. 在Java中动态传参调用Python脚本

    最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称 ...

  4. Java中apple导入那个包_在Java中,由Java编泽器自动导入而无需在程序中用import导入的包是()。A.java.appletB.java.awtC.j...

    在Java中,由Java编泽器自动导入而无需在程序中用import导入的包是().A.java.appletB.java.awtC.j 更多相关问题 问卷星是一个专业.无限制的免费在线问卷调查.测评. ...

  5. java中poi导入excel_java中使用poi实现导入Excel

    1.java中使用poi实现导入Excel public class XlsDto { /** * 选课号 */ private Integer xkh; /** * 学号 */ private St ...

  6. Java中静态导入(传智播客毕老师视频讲解)

    StaticImport  静态导入. 当类名重名时,需要指定具体的包名. 当方法重名是,指定具备所属的对象或者类. import java.util.*; import static java.ut ...

  7. java中的导入gnu,【JAVA学习笔记】静态导入

    1.使用方法 package tips; public interface Constants { public static final int PORT_NUMBER = 90; public s ...

  8. linux下执行python脚本并传入参数_实现在Java中执行python代码或py脚本(可传参数)...

    写在前面 最近用Java写服务端程序时,遇到这样一个需求:需要把用python写的机器学习算法部署到服务器上,然后Java执行py脚本,并且取得算法执行的结果.在网上找了很久,有些跑不通,有些是基于w ...

  9. java中bash应用_在bash脚本中查找java应用程序的进程ID(以查看目标应用程序是否已在运行)...

    我知道获取进程ID有一百万个问题,但这个问题似乎是独一无二的.谷歌没有给我答案,所以我希望stackexhange会帮助而不是关闭这个问题. 当涉及Java时,找到进程ID似乎比较棘手(pgrep不起 ...

最新文章

  1. java_pandas_Joinery
  2. 在M1芯片上跑原生Linux:编译速度比macOS还快40%,真香警告
  3. ITK:翻译矢量图像
  4. ddos攻击发送端 接收端_什么是DDOS攻击?
  5. android studio 使用问题 解决方法
  6. 《OpenGL编程指南》一1.2 初识OpenGL程序
  7. 信号与系统郭宝龙版 第二章 连续系统的时域分析 思维导图
  8. Java微信公众平台开发(十一)——开发中微信公众平台/开放平台/商户平台的关联
  9. 工行银企互联接入详解(1)--流程说明
  10. 基于spark2.0文本分词+多分类模型
  11. 企业微信登陆,操作企业微信通讯录(代码已上传github)
  12. Unity.TimeLine
  13. SSL协议密钥交换过程理解
  14. USTC English Club20171010
  15. Spring Boot打包跳过单元测试
  16. frame被废除_废除用户体验设计的假神
  17. LeetCode 160. 相交链表
  18. OpenStack Kolla-Ansible部署Designate域名解析服务DNS服务DNSaas
  19. 淘宝天猫使用内部优惠券购物省钱指南
  20. Relief特征选择算法

热门文章

  1. winform实时获取网卡网速全部源码,获取电脑上传下载速
  2. 邮币卡如何“做局”? 高回报诱惑下的陷阱
  3. C#文字转换语音朗读或保存MP3、WAV等格式
  4. linux查看文件的特殊权限,linux文件的特殊权限及隐藏权限
  5. 《Python编程:从入门到实践》第13章:外星人来了
  6. 机器学习小组知识点7:伯努利分布(Bernouli Distribution)
  7. VB小游戏设计(一):扫雷
  8. Django(九)模型:dj查询数据库的函数(方法)
  9. 第二届电气、机械与计算机工程国际学术会议(ICEMCE2018)简单记录
  10. python星星万花筒_少儿编程分享:码趣君教你用Python编写推星星游戏(完)