如何将附加模块链接至已构建的主单片机固件
裸机单片机可加载模块调用主固件函数的链接器方案问题
我正在开发一个裸机单片机项目,需要实现运行时加载代码块的功能,目前的基础实现流程是:
- 编写专用链接脚本,指定代码块加载到RAM区域
- 在模块镜像开头保留小型向量表
- 通过
memcpy将模块代码复制到目标RAM位置 - 从主固件读取模块向量表并跳转至入口点
核心问题
我需要让可加载模块的链接器支持直接回调主固件中的函数(避免重复实现工具函数、共享主固件数据),但不想用硬编码地址的方式。
示例场景
主固件中定义了如下函数:
int FunctionInMainFirmware() { return 1234; }
主固件编译链接生成ELF后转为BIN烧录到单片机,该函数在Flash中的固定地址信息为:
080b73b0 g F .text 00000008 _Z22FunctionInMainFirmwarev
目前在可加载模块中,只能通过硬编码地址调用该函数,这种方式繁琐且维护性差:
using myFunc = int(void); static const myFunc* f = reinterpret_cast<myFunc*>(0x080b73b0); int FunctionInLibrary() { return f(); // 希望能直接使用如下代码: // return FunctionInMainFirmware(); }
尝试过的方案及问题
我曾尝试使用链接器参数 -l:MyMainFirmware.elf,试图将主固件ELF当作静态库来解析模块中的未定义函数,但结果不符合预期:
- 链接器会将主固件ELF的全部内容复制到模块镜像中
- 地址计算出现异常,导致最终符号地址错乱
求助问题
请问有没有可行的方法实现以下需求之一:
- 让链接器仅读取主固件生成的
.map或.dmp文件,从中提取符号地址来解析模块的未定义函数 - 读取主固件ELF文件,但只提取其中的符号地址信息,不复制ELF内容、不修改原有地址
内容的提问来源于stack exchange,提问作者Matthew Kennedy
相关产品推荐
相关产品推荐

