文章目录
-
- [GCC 链接脚本中 DEFINED 函数](#GCC 链接脚本中 DEFINED 函数)
-
- [DEFINED() 函数](#DEFINED() 函数)
- > (放置在哪个区域)
- AT> (加载地址)
- [= (填充字节) 在链接脚本中,](#= (填充字节) 在链接脚本中,)
- 组合示例
GCC 链接脚本中 DEFINED 函数
在 ARM GCC 链接脚本(.ld
文件)中,DEFINED()
是一种内置函数,可以用来检查某个符号是否已经被定义。
>
和 AT>
是用于指定段应该放置在哪里的关键字。
DEFINED() 函数
DEFINED()
函数用于检查链接脚本中的符号是否已经定义。如果符号已经定义,它将返回 true
,否则返回 false
。这通常用于在链接脚本中做条件判断。
ld
/* 判断符号 _start 是否已定义 */
IF (DEFINED(_start))
{
/* 如果已定义,执行相关操作 */
}
> (放置在哪个区域)
在链接脚本中,>
关键字用于指定一个段应该放置在内存的哪个区域。例如,如果你有一个名为 ram
的内存区域,你可以使用 >
来指定 .data
段应当放置在 ram
中:
ld
SECTIONS
{
.data :
{
/* 段内容 */
} > ram
}
AT> (加载地址)
AT>
关键字用于指定一个段的加载地址(LMA),即数据应该被加载到内存中的位置。这通常用于初始化数据(例如 .data
段),这些数据在启动时从一个位置(如 Flash 存储器)复制到另一个位置(如 RAM)。
例如,将 .data
段放置在 RAM 中,但在 Flash 中指定它的加载地址:
ld
SECTIONS
{
.data :
{
/* 段内容 */
} > ram AT> flash
}
这意味着 .data
段的运行时地址(VMA)在 RAM 中,但它的内容在构建过程结束时将被加载到 Flash 中。
= (填充字节) 在链接脚本中,
=
关键字后面通常跟一个字节值,用于初始化分配的内存区域。这在为未初始化的数据段设置默认值时很有用。例如,将 .bss
段清零:
ld
SECTIONS
{
.bss :
{
/* 段内容 */
} > ram = 0x00
}
在这个例子中,=
后面的 0x00
表示所有 .bss
段中未初始化的内存都将被填充为字节 0x00
。
组合示例
将上述概念结合起来的示例:
在这个示例中:
.data
段被放置在ram
区域,但是其加载地址是flash
区域。.dtcm
段被放置在dtcm
区域(假设有一个名为dtcm
的内存区域),其加载地址也是flash
区域,并且该区域中未初始化的内存将被填充为0x00
。
这样的配置使得在程序启动时,.data
和 .dtcm
段的内容可以从 Flash 复制到它们在 RAM 中的运行时位置。