java中的导入gnu,GNU链接脚本使用
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链接脚本使用相关推荐
- java中Excel导入,下载模板,附带前端展示
java中Excel导入,下载模板,附带前端展示 后台下载模板代码 /*** 多个模板下载*/@RequestMapping(value = "/downloadExcel", m ...
- java中word导入数据库
java中word导入数据库 前言 > word导入到数据库主要是对word的解析,word分为2003版.2007版以上,还有xml格式的,2003和2007以上的主要是对单元格内容进行判断, ...
- 在Java中动态传参调用Python脚本
最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称 ...
- Java中apple导入那个包_在Java中,由Java编泽器自动导入而无需在程序中用import导入的包是()。A.java.appletB.java.awtC.j...
在Java中,由Java编泽器自动导入而无需在程序中用import导入的包是().A.java.appletB.java.awtC.j 更多相关问题 问卷星是一个专业.无限制的免费在线问卷调查.测评. ...
- java中poi导入excel_java中使用poi实现导入Excel
1.java中使用poi实现导入Excel public class XlsDto { /** * 选课号 */ private Integer xkh; /** * 学号 */ private St ...
- Java中静态导入(传智播客毕老师视频讲解)
StaticImport 静态导入. 当类名重名时,需要指定具体的包名. 当方法重名是,指定具备所属的对象或者类. import java.util.*; import static java.ut ...
- java中的导入gnu,【JAVA学习笔记】静态导入
1.使用方法 package tips; public interface Constants { public static final int PORT_NUMBER = 90; public s ...
- linux下执行python脚本并传入参数_实现在Java中执行python代码或py脚本(可传参数)...
写在前面 最近用Java写服务端程序时,遇到这样一个需求:需要把用python写的机器学习算法部署到服务器上,然后Java执行py脚本,并且取得算法执行的结果.在网上找了很久,有些跑不通,有些是基于w ...
- java中bash应用_在bash脚本中查找java应用程序的进程ID(以查看目标应用程序是否已在运行)...
我知道获取进程ID有一百万个问题,但这个问题似乎是独一无二的.谷歌没有给我答案,所以我希望stackexhange会帮助而不是关闭这个问题. 当涉及Java时,找到进程ID似乎比较棘手(pgrep不起 ...
最新文章
- java_pandas_Joinery
- 在M1芯片上跑原生Linux:编译速度比macOS还快40%,真香警告
- ITK:翻译矢量图像
- ddos攻击发送端 接收端_什么是DDOS攻击?
- android studio 使用问题 解决方法
- 《OpenGL编程指南》一1.2 初识OpenGL程序
- 信号与系统郭宝龙版 第二章 连续系统的时域分析 思维导图
- Java微信公众平台开发(十一)——开发中微信公众平台/开放平台/商户平台的关联
- 工行银企互联接入详解(1)--流程说明
- 基于spark2.0文本分词+多分类模型
- 企业微信登陆,操作企业微信通讯录(代码已上传github)
- Unity.TimeLine
- SSL协议密钥交换过程理解
- USTC English Club20171010
- Spring Boot打包跳过单元测试
- frame被废除_废除用户体验设计的假神
- LeetCode 160. 相交链表
- OpenStack Kolla-Ansible部署Designate域名解析服务DNS服务DNSaas
- 淘宝天猫使用内部优惠券购物省钱指南
- Relief特征选择算法
热门文章
- winform实时获取网卡网速全部源码,获取电脑上传下载速
- 邮币卡如何“做局”? 高回报诱惑下的陷阱
- C#文字转换语音朗读或保存MP3、WAV等格式
- linux查看文件的特殊权限,linux文件的特殊权限及隐藏权限
- 《Python编程:从入门到实践》第13章:外星人来了
- 机器学习小组知识点7:伯努利分布(Bernouli Distribution)
- VB小游戏设计(一):扫雷
- Django(九)模型:dj查询数据库的函数(方法)
- 第二届电气、机械与计算机工程国际学术会议(ICEMCE2018)简单记录
- python星星万花筒_少儿编程分享:码趣君教你用Python编写推星星游戏(完)