我正在开发一种裸机嵌入式应用程序;没有操作系统或MMU。我使用的是由arm-none-eabi-gcc,ld和make组成的工具链。它需要动态加载/卸载一些插件,我不知道如何为此配置创建脚本。
主机应用程序有一个已定义的插件系统API,它包含 init_plugin()和 execute_plugin()的函数声明。
有几个名为plugin01.c,plugin02.c ...的C文件,它们都在实现定义的API。我想编译它们然后将所有插件放在完全相同的地址空间中。只有一个插件一次加载,因此内存冲突没有问题。编译和链接后,我将从输出文件中提取这些插件,并将它们分别加载到目标硬件中。
我需要帮助解决两个问题:
答案 0 :(得分:0)
对于任何有兴趣的人,我设法解决了。
符号名称冲突的问题通过在所有部分前加上.pluginXX字符串,并将符号重命名为pluginXX_init_plugin和pluginXX_execute_plugin来解决。
通过使用链接器的OVERLAY功能解决了将所有插件代码放入相同地址空间的问题。所有插件与主机链接在一起,只有一个链接器传递,这可以保证所有内容都正确链接。
在此之前,我尝试通过将主机代码部分链接到目标文件中来进行两步链接,然后将目标文件分别与每个插件链接。这是浪费时间。在部分链接步骤期间,不能丢弃未使用的代码(--gc-sections选项不能与部分链接 - 可共存选项一起使用),并且代码不适合可用内存。