You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将附加模块链接至已构建的主单片机固件

裸机单片机可加载模块调用主固件函数的链接器方案问题

我正在开发一个裸机单片机项目,需要实现运行时加载代码块的功能,目前的基础实现流程是:

  • 编写专用链接脚本,指定代码块加载到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:45:31