当前位置: 首页 > news >正文

ARC学习(6)arc 编译器overlap 地址重叠方式使用

ARC学习(6)arc 编译器overlap 地址重叠方式使用

armclang/armcc overlay使用方法详见ARM学习(31)编译器对overlay方式的支持。

1、arc overlap 地址重叠方式使用

正常情况下面,链接脚本里面编写了两段section,如果两段section 地址一致,那么会出现如下链接错误

MEMORY
{ROM : ORIGIN = 0x00000000,LENGTH=64KOVERLAY : ORIGIN = 0x10000000,LENGTH=64KRAM : ORIGIN = 0x20000000,LENGTH=64KBANK0 : ORIGIN = 0x3000000,LENGTH=64KBANK1 : ORIGIN = 0x30010000,LENGTH= 64KBANK2 : ORIGIN = 0x30020000,LENGTH=64K
}SECTIONS
{GROUP ADDR(0x10000000)SIZE(64K):{.overlay_func0   ALIGN(4)BLOCK(4):{KEEP("(*.o)")}}>OVERLAY AT>BANKOGROUP ADDR(0x10000000)SIZE(64K):{.overlay_fun1 ALIGN(4) BLOCK(4): {KEEP("(*.o)")}}>OVERLAY AT>BANK1GROUP ADDR(0x10000000)SIZE(64K):{.overlay_fun2 ALIGN(4) BLOCK(4): {KEEP("(*.o)")}}>OVERLAY AT>BANK2
}

在这里插入图片描述
如果要进行内存复用,那么必须要把两段code放到同一个section,如果链接器不支持,那么就必定会出现上述的错误,所以在搜索arc的相关手册后,找到-zallow_memory_overlap,测试发现增加该链接选项后,地址即使重叠也不会报上述的重叠错误。

2、arc overlay示例

int test_count_g = 0;
__attribute__ ((section(".overlay fun0"))) int overlay_func1()
{test_count_g++;return test_count_g;
}__attribute__ ((section(".overlay fun1"))) int overlay_func1()
{test_count_g+=2;return test_count_g;
}__attribute__ ((section(".overlay fun2"))) int overlay_func1()
{test_count_g+=3;return test_count_g;
}
MEMORY
{ROM : ORIGIN = 0x00000000,LENGTH=64KOVERLAY : ORIGIN = 0x10000000,LENGTH=64KRAM : ORIGIN = 0x20000000,LENGTH=64KBANK0 : ORIGIN = 0x3000000,LENGTH=64KBANK1 : ORIGIN = 0x30010000,LENGTH= 64KBANK2 : ORIGIN = 0x30020000,LENGTH=64K
}SECTIONS
{GROUP ADDR(0x10000000)SIZE(64K):{.overlay_func0   ALIGN(4)BLOCK(4):{KEEP("(*.o)")}}>OVERLAY AT>BANKOGROUP ADDR(0x10000000)SIZE(64K):{.overlay_fun1 ALIGN(4) BLOCK(4): {KEEP("(*.o)")}}>OVERLAY AT>BANK1GROUP ADDR(0x10000000)SIZE(64K):{.overlay_fun2 ALIGN(4) BLOCK(4): {KEEP("(*.o)")}}>OVERLAY AT>BANK2
}
  • 由于是需要多个代码放在统一位置,所以执行地址是一致的,但是加载地址由于是多份,所以必须要放到不同的位置,所以需要通过分散加载才可以完成。

  • 因为多份地址,所以初始化的时候,执行地址的代码是空的,根据需要加载对应的代码。

  • 三份代码的符号对应同一个地址。

在这里插入图片描述
通过elf解析工具以及trace32 都可以确认,三个符号地址相同。

在这里插入图片描述

在这里插入图片描述

  • 如果需要加载overlay_func0,则加载对应的bin文件。

在这里插入图片描述
在这里插入图片描述

  • 如果需要加载overlay_func1,则加载对应的bin文件。

在这里插入图片描述

  • 如果需要加载overlay_func2,则加载对应的bin文件。

在这里插入图片描述

map 文件如下

在这里插入图片描述

链接脚本实例:
有加载地址,利用分散加载原理,生成相关bin文件。

MEMORY
{ROM : ORIGIN = 0x00000000,LENGTH=64KOVERLAY : ORIGIN = 0x10000000,LENGTH=64KRAM : ORIGIN = 0x20000000,LENGTH=64KBANK0 : ORIGIN = 0x3000000,LENGTH=64KBANK1 : ORIGIN = 0x30010000,LENGTH= 64KBANK2 : ORIGIN = 0x30020000,LENGTH=64K
}SECTIONS
{GROUP ADDR(0x00000000)  SIZE(64K) : {text ALIGN(4)BLOCK(4):{KEEP("(*.o)")}.rodata ALIGN(4)BLOCK(4):{KEEP("(*.o)")}.vectors ALIGN(4)BLOCK(4):{KEEP("(*.o)")}}>ROMGROUP ADDR(0x10000000)SIZE(64K):{.overlay_func0   ALIGN(4)BLOCK(4):{KEEP("(*.o)")}}>OVERLAY AT>BANKOGROUP ADDR(0x10000000)SIZE(64K):{.overlay_fun1 ALIGN(4) BLOCK(4): {KEEP("(*.o)")}}>OVERLAY AT>BANK1GROUP ADDR(0x10000000)SIZE(64K):{.overlay_fun2 ALIGN(4) BLOCK(4): {KEEP("(*.o)")}}>OVERLAY AT>BANK2GROUP ADDR(0x20000000)SIZE(64K):{.overlay_fun2 ALIGN(4) BLOCK(4): {KEEP("(*.o)")}}>OVERLAY AT>BANK2
}

在这里插入图片描述
有AT 重定向之后,虚拟地址0x10000000,物理地址 0x30000000,也就是加载地址。

只有执行地址,没有加载地址

MEMORY
{ROM : ORIGIN = 0x00000000,LENGTH=64KOVERLAY : ORIGIN = 0x10000000,LENGTH=64KRAM : ORIGIN = 0x20000000,LENGTH=64KBANK0 : ORIGIN = 0x3000000,LENGTH=64KBANK1 : ORIGIN = 0x30010000,LENGTH= 64KBANK2 : ORIGIN = 0x30020000,LENGTH=64K
}SECTIONS
{GROUP ADDR(0x00000000)  SIZE(64K) : {text ALIGN(4)BLOCK(4):{KEEP("(*.o)")}.rodata ALIGN(4)BLOCK(4):{KEEP("(*.o)")}.vectors ALIGN(4)BLOCK(4):{KEEP("(*.o)")}}>ROMGROUP ADDR(0x10000000)SIZE(64K):{.overlay_func0   ALIGN(4)BLOCK(4):{KEEP("(*.o)")}}>OVERLAY GROUP ADDR(0x10000000)SIZE(64K):{.overlay_fun1 ALIGN(4) BLOCK(4): {KEEP("(*.o)")}}>OVERLAY GROUP ADDR(0x10000000)SIZE(64K):{.overlay_fun2 ALIGN(4) BLOCK(4): {KEEP("(*.o)")}}>OVERLAY }

没有重定向,则虚拟地址和物理地址一样,均是最后的可执行地址。

在这里插入图片描述

对于section来说,因为是执行视图,所以两者都一致,bin的位置也一样,可以解析出想关的bin数据,然后加载。

在这里插入图片描述

在这里插入图片描述

http://www.dtcms.com/a/290263.html

相关文章:

  • stm32mp157f-dk2安装镜像并且部署qt全流程
  • 基于uniapp的餐厅在线选餐小程序的设计与实现
  • 信息整合注意力IIA,通过双方向的轻量级注意力机制强化目标关键特征并抑制噪声,提升特征融合的有效性和空间位置信息的保留能力。
  • Qt的QAbstractTableModel
  • 基于大数据的旅游推荐系统 Python+Django+Hive+Vue.js
  • 三大工厂设计模式
  • 电商项目_秒杀_初步分析
  • Django视图与路由系统
  • Jetpack ViewModel LiveData:现代Android架构组件的核心力量
  • echarts图铺满父元素
  • 在翻译语义相似度和会议摘要相似度评估任务中 ,分类任务 回归任务 生成任务区别
  • k8s查看某个pod的svc
  • Zookeeper 注册中心垂直介入
  • ZooKeeper学习专栏(四):单机模式部署与基础操作详解
  • 来伊份养馋记社区零售 4.0 上海首店落沪:重构 “家门口” 的生活服务生态
  • ZooKeeper学习专栏(三):ACL权限控制与Zab协议核心原理
  • Qt5线程相关事项
  • 使用 Tailwind CSS 控制元素在移动端不显示
  • 【Docker#3】Window 和 Linux 上 docker安装 相关知识
  • AWS IoT Core CloudWatch监控完整指南
  • Linux C 多线程基本操作
  • Product Hunt 每日热榜 | 2025-07-21
  • 2025最新版虚幻引擎5(UE5)入门教程:前言——你的随身教程和学习笔记
  • Freemarker实现下载word可能遇到的问题
  • 星游路-个人日志-学习积累法
  • 结构型模式-架构解耦与扩展实践
  • 遗像照片尺寸要求及手机制作打印方法
  • 【Java学习|黑马笔记|Day19】方法引用、异常(try...catch、自定义异常)及其练习
  • Linux程序构建核心:ELF文件编译、链接与加载机制详解
  • 隧道代理的动态IP切换机制与实现原理