有没有一种方法可以将目录中所有源文件中的某种类型的数据映射到链接器命令文件中的内存部分而不是显式的?
Is there a way to map a certain type of data from all source files in a directory to a memory section in a linker command file without being explicit?
我正在为我正在处理的 ARM 项目使用 GNU 工具链。该项目包括一个实时操作系统 (RTOS) 并利用 ARM Cortex-R4 CPU.
的内存保护单元 (MPU)
我正在使用链接器命令 (.ld
) 文件将 .bss
和 .data
部分映射到可用于需要访问的任务的内存块。
这个特定的应用程序有几个不同的构建配置。该项目有两个顶级源代码文件夹,出于所有意图和目的,我将其称为 common
和 custom
。文件夹 common
包含所有构建配置使用的所有源代码,文件夹 custom
包含每个构建配置的一个子文件夹,其中包含特定于该构建配置的源代码。例如custom/build_cfg1
、custom/build_cfg2
等
所有 custom
源代码都是从单个 RTOS 任务调用的。我想设置链接器文件,以便能够根据文件位置将 custom
文件夹中的所有 .data
和 .bss
部分放入一个单独的部分中,但是我的方法我正在使用没有捕获 .data
和 .bss
部分。以下是链接器命令文件的示例:
.custom_bss (NOLOAD) : AT (0)
{
custom_bss_start = .;
"./custom/*" (.bss.*)
custom_bss_end = .;
}
/* Define initialized data separately since it must be loaded. */
.custom_data : AT(ld_custom_data_load_addr)
{
custom_data_start = .;
"./custom/*" (.data.*)
custom_data_end = .;
}
注意几点:
- 我已经验证传递给链接器的文件路径以
./custom/
开头并且 .data
和 .bss
部分被映射到包罗万象的 .data
和 .bss
个部分。
common
文件夹中的源文件已根据需要映射。
- 我已将构建器配置为在编译和链接时仅包含活动构建配置的文件。
- 节是使用
.bss.*
和 .data.*
指定的,因为我在编译时使用了 -fdata-sections
选项。
是否有指定文件名的技术,允许我使用链接器命令文件将文件夹及其子文件夹中的所有 .bss
和 .data
部分映射到特定部分?
不,不可能。
来自 ld
文档:
Wildcards only match files which are explicitly specified on the
command line. The linker does not search directories to expand
wildcards.
我会用另一种方式来做。编写一个简单的程序并 运行 它在构建之前显式添加文件(或至少是目录)。易于在 make、cmake 或 eclipse 中存档。
经过进一步调查,我发现实际上我定义输入部分(.bss)而不是(.bss.*)的方式有问题。更正此问题后,./custom/*/*.o (.bss.*)
能够从 custom
.
的子目录和子目录的子目录中的源文件中提取 .bss 部分
我正在为我正在处理的 ARM 项目使用 GNU 工具链。该项目包括一个实时操作系统 (RTOS) 并利用 ARM Cortex-R4 CPU.
的内存保护单元 (MPU)我正在使用链接器命令 (.ld
) 文件将 .bss
和 .data
部分映射到可用于需要访问的任务的内存块。
这个特定的应用程序有几个不同的构建配置。该项目有两个顶级源代码文件夹,出于所有意图和目的,我将其称为 common
和 custom
。文件夹 common
包含所有构建配置使用的所有源代码,文件夹 custom
包含每个构建配置的一个子文件夹,其中包含特定于该构建配置的源代码。例如custom/build_cfg1
、custom/build_cfg2
等
所有 custom
源代码都是从单个 RTOS 任务调用的。我想设置链接器文件,以便能够根据文件位置将 custom
文件夹中的所有 .data
和 .bss
部分放入一个单独的部分中,但是我的方法我正在使用没有捕获 .data
和 .bss
部分。以下是链接器命令文件的示例:
.custom_bss (NOLOAD) : AT (0)
{
custom_bss_start = .;
"./custom/*" (.bss.*)
custom_bss_end = .;
}
/* Define initialized data separately since it must be loaded. */
.custom_data : AT(ld_custom_data_load_addr)
{
custom_data_start = .;
"./custom/*" (.data.*)
custom_data_end = .;
}
注意几点:
- 我已经验证传递给链接器的文件路径以
./custom/
开头并且.data
和.bss
部分被映射到包罗万象的.data
和.bss
个部分。 common
文件夹中的源文件已根据需要映射。- 我已将构建器配置为在编译和链接时仅包含活动构建配置的文件。
- 节是使用
.bss.*
和.data.*
指定的,因为我在编译时使用了-fdata-sections
选项。
是否有指定文件名的技术,允许我使用链接器命令文件将文件夹及其子文件夹中的所有 .bss
和 .data
部分映射到特定部分?
不,不可能。
来自 ld
文档:
Wildcards only match files which are explicitly specified on the command line. The linker does not search directories to expand wildcards.
我会用另一种方式来做。编写一个简单的程序并 运行 它在构建之前显式添加文件(或至少是目录)。易于在 make、cmake 或 eclipse 中存档。
经过进一步调查,我发现实际上我定义输入部分(.bss)而不是(.bss.*)的方式有问题。更正此问题后,./custom/*/*.o (.bss.*)
能够从 custom
.