gcc:自定义部分中单独的代码和数据

gcc:自定义部分中单独的代码和数据,gcc,sections,Gcc,Sections,我有一个软件,它正在从另一个工具链迁移到gcc(arm ONE eabi工具链)。在软件中,有几个自定义的部分,用于构造数据/代码,使用不同的内存组件 使用gcc工具链,我有一个带有自定义部分的链接器脚本文件。使用旧的工具链,我可以只使用#pragma section来处理一块代码和数据或整个文件。编译器使用给定的节名,在代码、数据、rodata和bss的相应节中内部分离此类#pragma节块。 对于gcc,我只有两个选择: 向每个变量/函数添加\uuuuuuuuuuuuuuuuuu属性((节(

我有一个软件,它正在从另一个工具链迁移到gcc(
arm ONE eabi工具链
)。在软件中,有几个自定义的部分,用于构造数据/代码,使用不同的内存组件

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

  • 向每个变量/函数添加
    \uuuuuuuuuuuuuuuuuu属性((节(“”)
  • 使用链接器脚本文件将整个文件添加到节中
  • 我的问题是,我现在有大约300个文件必须被处理并映射到一个特定的部分,而代码/数据分离保持不变。这些文件同时包含数据和代码。 因此,如果我使用链接器脚本映射文件,那么所有数据和代码都将映射到这个特定的部分,没有代码和数据分离。 如果我在每个变量/函数中添加
    \uuuu属性\uuu
    关键字,则需要几天才能完成此操作

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

    • 向“mysection.bss”添加非斜体变量
    • 已将数据初始化为“mysection.data”
    • 只读数据到“mysection.rodata”
    • “mysection.text”的代码

    gcc可以对标准节执行此操作。

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

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

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

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

    由于缺少
    #pragma节
    或专用编译器标志,我不确定是否有办法实现这一点(我希望我错了)您可以编写一个脚本来扫描代码中的pragma,并将适当的属性附加到后面的函数。由于没有
    #pragma节
    或专用的编译器标志,我不确定是否有办法实现这一点(我希望我错了)您可以编写一个脚本来扫描代码中的杂注,并将适当的属性附加到后面的函数。