Edit online

Dynamic Module 使用指南

在 Linux/Windows 等大型系统中应用和驱动是可以独立开发,应用独立编译成 elf/exe 文件,然后在目标系统上执行。毫无疑问这种动态加载的方式是需要开销的,一般嵌入式系统都精简了该功能。但是在实际产品开发的过程中,特别是需要二次开发的场景,独立开发和编译应用程序有强烈需求。

Luban-Lite 使用动态模块 (Dynamic Module) 机制来支持应用程序独立开发的需求。基本原理如下:

../../../images/dm_design.png
1. Dynamic Module 实现原理

核心就是实现了 ELF 的链接和加载。具体步骤分解如下:

  1. 编译链接:使用 gcc 工具链将应用源文件 main.c 使用 -fPIC -shared 选项编译链接成 ET_DYN 格式的 ELF 文件 hello.mohello.mo 是一个标准的 ET_DYN 格式 ELF 文件,位置无关且可动态链接。
    注: 需要使用 riscv-none-embed-gcc 工具链,否则会编译不成功。
  2. 文件加载:在运行的时候,首先会把 hello.mo 文件的数据段代码段拷贝到内存当中。因为我们编译的是位置无关代码 PIC,代码可以被加载到任意位置,所以可以从 Heap 中动态分配内存再进行代码拷贝。此时代码还是不能运行,因为代码中还存在很多对系统函数的调用,需要重新定位重新链接。

  3. 动态链接:遍历 hello.mo 中的可重定位段,对需要重定位的符号,在内核的导出符号表 rtmsymtab 中查询,将查询到的绝对地址回填到可重定位符号的位置。至此完成动态链接,可以跳转到程序入口处执行了。