Dynamic Module 使用指南
在 Linux/Windows 等大型系统中应用和驱动是可以独立开发,应用独立编译成 elf/exe 文件,然后在目标系统上执行。毫无疑问这种动态加载的方式是需要开销的,一般嵌入式系统都精简了该功能。但是在实际产品开发的过程中,特别是需要二次开发的场景,独立开发和编译应用程序有强烈需求。
Luban-Lite 使用动态模块 (Dynamic Module) 机制来支持应用程序独立开发的需求。基本原理如下:

核心就是实现了 ELF 的链接和加载。具体步骤分解如下:
-
编译链接:使用
gcc
工具链将应用源文件main.c
使用-fPIC -shared
选项编译链接成ET_DYN
格式的 ELF 文件hello.mo
。hello.mo
是一个标准的ET_DYN
格式 ELF 文件,位置无关且可动态链接。注: 需要使用riscv-none-embed-gcc
工具链,否则会编译不成功。 -
文件加载:在运行的时候,首先会把
hello.mo
文件的数据段代码段拷贝到内存当中。因为我们编译的是位置无关代码 PIC,代码可以被加载到任意位置,所以可以从 Heap 中动态分配内存再进行代码拷贝。此时代码还是不能运行,因为代码中还存在很多对系统函数的调用,需要重新定位重新链接。 -
动态链接:遍历
hello.mo
中的可重定位段,对需要重定位的符号,在内核的导出符号表rtmsymtab
中查询,将查询到的绝对地址回填到可重定位符号的位置。至此完成动态链接,可以跳转到程序入口处执行了。