有没有一种方法可以将目录中所有源文件中的某种类型的数据映射到链接器命令文件中的内存部分而不是显式的?

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 部分映射到可用于需要访问的任务的内存块。

这个特定的应用程序有几个不同的构建配置。该项目有两个顶级源代码文件夹,出于所有意图和目的,我将其称为 commoncustom。文件夹 common 包含所有构建配置使用的所有源代码,文件夹 custom 包含每个构建配置的一个子文件夹,其中包含特定于该构建配置的源代码。例如custom/build_cfg1custom/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 = .;
    }

注意几点:

是否有指定文件名的技术,允许我使用链接器命令文件将文件夹及其子文件夹中的所有 .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 部分