【ARM 嵌入式 编译系列 7.3 -- GCC 链接脚本中 NOLOAD 和 GROUP 的详细介绍】

文章目录

  • [NOLOAD 和 GROUP 的详细介绍](#NOLOAD 和 GROUP 的详细介绍)
      • [NOLOAD 关键字](#NOLOAD 关键字)
      • [GROUP 关键字](#GROUP 关键字)
      • 实际应用案例

NOLOAD 和 GROUP 的详细介绍

在使用 arm-none-eabi-gcc 工具链中的链接器脚本时,链接脚本使用链接器命令语言来描述如何生成最终的可执行文件。其中,noloadgroup 是两个用于控制链接过程的关键字。

NOLOAD 关键字

NOLOAD 关键字用于指示链接器在输出文件中分配空间给指定的段(section),但实际上不将段的内容加载到输出文件中。这通常用于创建未初始化的数据段(比如 .bss)或者为特定目的预留空间,但节省了镜像文件的大小。
示例

ld 复制代码
SECTIONS { 
	.bss (NOLOAD) : { 
		*(.bss) 
		} 
}

在这个例子中,.bss 段被指示为 NOLOAD。因此,虽然为 .bss 段的变量分配了地址空间,但在输出文件(如 ELF 文件)中不会占用实际的存储空间。

GROUP 关键字

GROUP 关键字用于将多个输入段(sections)组合成一个组,并作为一个整体来处理。链接器可以对这些组中的段进行排序或者管理,便于把相关的段组织在一起。
示例

ld 复制代码
SECTIONS { 
	.data : { 
		GROUP : { 
			data.o(.data) 
			moredata.o(.data) 
			} 
		} 
	} 

在这个例子中,data.omoredata.o 中的 .data 段被放在一个组里。链接器将这个组看作是一个单独的单元,这对于管理和优化链接过程很有帮助。

实际应用案例

在嵌入式系统中,你可能会碰到需要将一些特定的数据放置在单独的内存区域(如 EEPROM 或特定的 RAM 区域)的情况。你可以使用 noload 关键字来处理不需要初始化的数据,或者使用 group 关键字来将相关的段组织在一起,以便特殊处理。

ld 复制代码
/* 定义内存区域 */ 
MEMORY 
{ 
	FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256K 
	RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K 
	EEPROM (rw) : ORIGIN = 0x08080000, LENGTH = 4K 
} 
/* 定义段的放置 */ 
SECTIONS 
{ 
	/* 将初始化的数据放在 FLASH 中 */ 
	.text : { 
		*(.text) 
} > FLASH 

	/* 将未初始化的数据放在 RAM 中,但不将它们加载到 ELF 文件中 */ 
	.bss (NOLOAD) : { 
		*(.bss) 
	} > RAM 

	/* 将特定对象文件的数据段放在 EEPROM 中 */ 
	.eeprom_data : { 
		GROUP : { 
			settings.o(.data) 
			} 
	} > EEPROM } 

在这个例子中,.text 段被放置在 FLASH 区域,.bss 段被标记为 NOLOAD 并放在 RAM 中,而特定于 settings.o 文件的 .data 段被组织成一个组并放置在 EEPROM 区域。 通过使用这些链接器脚本关键字,可以精确控制段的放置和初始化,这在资源受限的嵌入式系统中非常重要。

相关推荐
szxinmai主板定制专家1 分钟前
基于 ARM+FPGA 数据机床实时工业控制设计--以雕刻机为例
arm开发·人工智能·嵌入式硬件·fpga开发
wandertp14 分钟前
对信号处理及滤波器的理解---基于robomaster机器人嵌入式控制系统
arm开发·stm32·算法·信号处理
XMAIPC_Robot29 分钟前
基于RK3588 ARM+FPGA电火花数控机床控制系统设计,兼顾ethercat软硬件实时
linux·arm开发·人工智能·嵌入式硬件·fpga开发
底层开发智库36 分钟前
C1-Ultra FVP调试并运行Linux kernel全程记录,硬核演示如何解决启动问题
linux·arm开发·内核·嵌入式·arm
XMAIPC_Robot1 小时前
基于 ARM+FPGA 数据机床控制系统设计--以雕刻机为例
arm开发·fpga开发
一抹晴空16 小时前
Keil MDK AC6 compiler编译报错,与AC5区别
c语言·arm开发·单片机
运维成长记17 小时前
关于“有x86镜像,没有Dockerfile” 怎么制作arm架构的镜像
arm开发·架构
熠速1 天前
PolarBox高性能实时仿真系统
arm开发·fpga开发·嵌入式实时数据库·硬件在环半实物仿真
天下·第二2 天前
如何在【x86】服务器上打包构建【arm】镜像
服务器·arm开发·eureka
止观止2 天前
在 WSL2 上从零搭建 ARM 混合编程环境
汇编·arm开发·嵌入式开发·混合编程