将多个插件链接到同一内存 space

Linking multiple plugins to same memory space

我正在开发裸机嵌入式应用程序;没有 OS 或 MMU。我正在使用由 arm-none-eabi-gcc、ld 和 make 组成的工具链。它需要一些动态插件loaded/unloaded,我不知道如何为这个配置创建脚本。

主机应用程序为插件系统定义了 API,它由 init_plugin()[ 的函数声明组成=34=]().

有几个名为 plugin01.c、plugin02.c... 的 C 文件,它们都实现了定义的 API。我想编译它们,然后将所有插件放在完全相同的地址 space。一次只加载一个插件,因此不存在内存冲突问题。编译和链接后,我将从输出文件中提取这些插件并将它们分别加载到目标硬件中。

我需要帮助解决两个问题:

对于任何感兴趣的人,我设法解决了它。

符号名称冲突的问题已通过在所有部分添加前缀 .pluginXX 字符串并将符号重命名为 pluginXX_init_plugin 和 pluginXX_execute_plugin.

来解决

将所有插件代码放入同一地址的问题 space 已通过使用链接器的 OVERLAY 功能解决。所有插件仅通过一个链接器通道与主机链接在一起,这保证了所有内容都正确链接。

在此之前,我尝试了两步链接,仅将主机代码部分链接到目标文件中,然后将其分别链接到每个插件。这是浪费时间。在部分链接步骤中,无法丢弃未使用的代码(--gc-sections 选项无法与部分链接一起使用 --relocatable 选项)并且代码不适合可用内存。