将多个插件链接到相同的内存空间

时间:2015-07-06 17:10:51

标签: plugins gnu-make ld linker-scripts bare-metal

我正在开发一种裸机嵌入式应用程序;没有操作系统或MMU。我使用的是由arm-none-eabi-gcc,ld和make组成的工具链。它需要动态加载/卸载一些插件,我不知道如何为此配置创建脚本。

主机应用程序有一个已定义的插件系统API,它包含 init_plugin() execute_plugin()的函数声明。

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

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

  • 链接器不应该抱怨同一功能的多个不同定义
  • 链接器需要将pluginXX.c文件中的所有代码放入相同的内存范围。它应该在链接每个插件后重置位置计数器。它应该分配相同的VMA和不同的LMA。相同的VMA允许在该位置加载插件时运行插件,而不同的LMA允许我从输出文件中提取已编译和链接的插件。

1 个答案:

答案 0 :(得分:0)

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

符号名称冲突的问题通过在所有部分前加上.pluginXX字符串,并将符号重命名为pluginXX_init_plugin和pluginXX_execute_plugin来解决。

通过使用链接器的OVERLAY功能解决了将所有插件代码放入相同地址空间的问题。所有插件与主机链接在一起,只有一个链接器传递,这可以保证所有内容都正确链接。

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