【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 区域。 通过使用这些链接器脚本关键字,可以精确控制段的放置和初始化,这在资源受限的嵌入式系统中非常重要。

相关推荐
森焱森18 小时前
嵌入式硬件工程师应知 白银快速分析报告
linux·c语言·arm开发·嵌入式硬件·去中心化
森G1 天前
七、04ledc-sdk--------makefile有变化
linux·c语言·arm开发·c++·ubuntu
VekiSon1 天前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
AI+程序员在路上1 天前
Nand Flash与EMMC区别及ARM开发板中的应用对比
arm开发
17(无规则自律)2 天前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
梁洪飞2 天前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
代码游侠3 天前
学习笔记——Linux字符设备驱动
linux·运维·arm开发·嵌入式硬件·学习·架构
syseptember3 天前
Linux网络基础
linux·网络·arm开发
代码游侠3 天前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
程序猿阿伟4 天前
《Apple Silicon与Windows on ARM:引擎原生构建与模拟层底层运作深度解析》
arm开发·windows