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

Posted

技术标签:

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

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

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

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

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

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

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

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

【问题讨论】:

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

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

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

【讨论】:

以上是关于gcc:自定义部分中的单独代码和数据的主要内容,如果未能解决你的问题,请参考以下文章

GCC - 在没有链接描述文件的情况下获取自定义部分的大小

微信小程序自定义组件的使用以及调用自定义组件中的方法

自定义 SQL 排序依据

angularjs自定义指令实现分页插件

使用自定义构建的 gcc(g++) 构建 c++ 项目

如何将具有自定义属性的组件移动到 QML 中的单独文件