将多个插件链接到同一内存 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.c 文件中的所有代码放入相同的内存范围。它应该在链接每个插件后重置位置计数器。它应该分配相同的 VMA 和不同的 LMA。相同的 VMA 允许 运行 插件加载到该位置时,不同的 LMA 允许我从输出文件中提取编译和链接的插件。
对于任何感兴趣的人,我设法解决了它。
符号名称冲突的问题已通过在所有部分添加前缀 .pluginXX 字符串并将符号重命名为 pluginXX_init_plugin 和 pluginXX_execute_plugin.
来解决
将所有插件代码放入同一地址的问题 space 已通过使用链接器的 OVERLAY 功能解决。所有插件仅通过一个链接器通道与主机链接在一起,这保证了所有内容都正确链接。
在此之前,我尝试了两步链接,仅将主机代码部分链接到目标文件中,然后将其分别链接到每个插件。这是浪费时间。在部分链接步骤中,无法丢弃未使用的代码(--gc-sections 选项无法与部分链接一起使用 --relocatable 选项)并且代码不适合可用内存。
我正在开发裸机嵌入式应用程序;没有 OS 或 MMU。我正在使用由 arm-none-eabi-gcc、ld 和 make 组成的工具链。它需要一些动态插件loaded/unloaded,我不知道如何为这个配置创建脚本。
主机应用程序为插件系统定义了 API,它由 init_plugin() 和 [ 的函数声明组成=34=]().
有几个名为 plugin01.c、plugin02.c... 的 C 文件,它们都实现了定义的 API。我想编译它们,然后将所有插件放在完全相同的地址 space。一次只加载一个插件,因此不存在内存冲突问题。编译和链接后,我将从输出文件中提取这些插件并将它们分别加载到目标硬件中。
我需要帮助解决两个问题:
- 链接器不应抱怨同一函数的多个不同定义
- 链接器需要将 pluginXX.c 文件中的所有代码放入相同的内存范围。它应该在链接每个插件后重置位置计数器。它应该分配相同的 VMA 和不同的 LMA。相同的 VMA 允许 运行 插件加载到该位置时,不同的 LMA 允许我从输出文件中提取编译和链接的插件。
对于任何感兴趣的人,我设法解决了它。
符号名称冲突的问题已通过在所有部分添加前缀 .pluginXX 字符串并将符号重命名为 pluginXX_init_plugin 和 pluginXX_execute_plugin.
来解决将所有插件代码放入同一地址的问题 space 已通过使用链接器的 OVERLAY 功能解决。所有插件仅通过一个链接器通道与主机链接在一起,这保证了所有内容都正确链接。
在此之前,我尝试了两步链接,仅将主机代码部分链接到目标文件中,然后将其分别链接到每个插件。这是浪费时间。在部分链接步骤中,无法丢弃未使用的代码(--gc-sections 选项无法与部分链接一起使用 --relocatable 选项)并且代码不适合可用内存。