【问题标题】: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?有没有一种方法可以将目录中所有源文件中的某种类型的数据映射到链接器命令文件中的内存部分而不显式?
【发布时间】:2021-10-28 16:48:33
【问题描述】:

我正在将 GNU 工具链用于我正在处理的 ARM 项目。该项目包括一个实时操作系统 (RTOS),并利用了 ARM Cortex-R4 CPU 的内存保护单元 (MPU)。

我正在使用链接器命令 (.ld) 文件将 .bss.data 部分映射到可供需要访问的任务使用的内存块。

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

需要注意的几点:

  • 我已验证传递给链接器的文件路径以./custom/ 开头,并且.data.bss 部分被映射到全部.data.bss 部分。
  • common 文件夹中的源文件已根据需要进行映射。
  • 我已将构建器配置为仅在编译和链接时包含活动构建配置的文件。
  • 部分是使用.bss.*.data.* 指定的,因为我在编译时使用了-fdata-sections 选项。

是否有一种指定文件名的技术,允许我使用链接器命令文件将文件夹及其子文件夹中的所有 .bss.data 部分映射到特定部分?

【问题讨论】:

    标签: c gcc linker gnu ld


    【解决方案1】:

    不,这是不可能的。

    来自ld文档:

    通配符只匹配在 命令行。链接器不搜索要展开的目录 通配符。

    我会换一种方式。编写一个简单的程序并在构建之前运行它显式添加文件(或至少是目录)。易于在 make、cmake 或 eclipse 中存档。

    【讨论】:

    • 感谢您抽出时间来回答。我也在链接器文档页面 (ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_chapter/…) 上看到了这一点,但它似乎有点模糊,所以我希望它有一个技巧。原来它的工作方式和我最初的方式一样,我只是在指定输入部分时犯了一个错误(.bss 而不是 .bss.*)。
    【解决方案2】:

    经过进一步调查,我发现我定义输入部分 (.bss) 而不是 (.bss.*) 的方式实际上存在问题。纠正此问题后,./custom/*/*.o (.bss.*) 能够从 custom 的子目录和子目录的子目录中的源文件中提取 .bss 部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-24
      • 2012-05-13
      • 2016-06-27
      • 2021-12-17
      • 2012-05-28
      • 2011-09-24
      • 2018-08-01
      相关资源
      最近更新 更多