【ARM 嵌入式 编译系列 7.3 -- GCC 链接脚本中 NOLOAD 和 GROUP 的详细介绍】
NOLOAD 和 GROUP 的详细介绍
在使用 arm-none-eabi-gcc
工具链中的链接器脚本时,链接脚本使用链接器命令语言来描述如何生成最终的可执行文件。其中,noload
和 group
是两个用于控制链接过程的关键字。
NOLOAD 关键字
NOLOAD
关键字用于指示链接器在输出文件中分配空间给指定的段(section),但实际上不将段的内容加载到输出文件中。这通常用于创建未初始化的数据段(比如 .bss
)或者为特定目的预留空间,但节省了镜像文件的大小。
示例:
SECTIONS {
.bss (NOLOAD) : {
*(.bss)
}
}
在这个例子中,.bss
段被指示为 NOLOAD
。因此,虽然为 .bss
段的变量分配了地址空间,但在输出文件(如 ELF 文件)中不会占用实际的存储空间。
GROUP 关键字
GROUP
关键字用于将多个输入段(sections)组合成一个组,并作为一个整体来处理。链接器可以对这些组中的段进行排序或者管理,便于把相关的段组织在一起。
示例:
SECTIONS {
.data : {
GROUP : {
data.o(.data)
moredata.o(.data)
}
}
}
在这个例子中,data.o
和 moredata.o
中的 .data
段被放在一个组里。链接器将这个组看作是一个单独的单元,这对于管理和优化链接过程很有帮助。
实际应用案例
在嵌入式系统中,你可能会碰到需要将一些特定的数据放置在单独的内存区域(如 EEPROM 或特定的 RAM 区域)的情况。你可以使用 noload
关键字来处理不需要初始化的数据,或者使用 group
关键字来将相关的段组织在一起,以便特殊处理。
/* 定义内存区域 */
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 区域。 通过使用这些链接器脚本关键字,可以精确控制段的放置和初始化,这在资源受限的嵌入式系统中非常重要。
原文地址:https://blog.csdn.net/sinat_32960911/article/details/135289429
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!