【问题标题】:gcc: separate code and data in custom sectionsgcc:自定义部分中的单独代码和数据
【发布时间】:2017-09-29 12:28:19
【问题描述】:

我有一个软件,它正在从另一个工具链迁移到 gcc (arm-none-eabi toolchain)。在软件中有一些自定义的部分,以便结构化数据/代码,使用不同的内存组件。

使用 gcc 工具链,我有一个带有自定义部分的链接器脚本文件。使用旧工具链,我可以将#pragma section 用于代码和数据块或整个文件。编译器使用给定的节名称在内部分隔代码、数据、rodata 和 bss 的相应节中的 #pragma section 块。 使用 gcc 我只有两个选择:

  1. 在每个变量/函数中添加__attribute__((section(""))
  2. 使用链接描述文件将整个文件添加到节中

我的问题是,我现在有大约 300 个文件必须处理并映射到特定部分,同时保留代码/数据分离。这些文件包含数据和代码。 所以如果我使用链接描述文件映射文件,那么所有数据和代码都将映射到这个特定的部分,没有代码和数据分离。 如果我将 __attribute__ 关键字添加到每个变量/函数,则需要几天时间才能完成。

有没有办法告诉 gcc 将整个文件/整个块映射到特定部分,并自动分离数据和代码?假设部分名称是“mysection”,我想将整个文件映射到“mysection”,gcc 应该自动执行以下操作:

  • 将未初始化的变量添加到“mysection.bss”
  • 将数据初始化到“mysection.data”
  • 只读数据到“mysection.rodata”
  • “mysection.text”的代码

gcc 能够为标准部分做到这一点。

【问题讨论】:

  • 由于没有#pragma section 或专用的编译器标志,我不确定有没有办法实现这一点(我希望我错了)
  • 您可以编写一个脚本来扫描您的代码中的编译指示并将适当的属性附加到跟随它们的函数。
  • 正则表达式!使用正则表达式!

标签: gcc sections


【解决方案1】:

您可以通过调用 objcopy 来补充 Makefile 中的编译命令:

for s in .bss .data .rodata .text; do
  objcopy --rename-section $s=mysection$s file.o
done

【讨论】:

    猜你喜欢
    • 2021-11-12
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多