如何将地址分配给来自另一个库的外部符号而不将其包含在 ld 的输出中?

How to assign address to external symbols from another library without including it in the output of ld?

这里是上下文:

我正在为 arduino(SAMD21 MCU)开发某种微型 OS。 我希望引导加载程序加载 OS(简单的部分,官方的有效,OS 是 linked with a "with-bootloader.ld" 脚本)。然后,以引导加载程序加载 OS 的类似方式从 OS 加载应用程序。 (OS 部分很容易)

这样做,OS 不必重新编程,只有应用程序会发生变化。

这里的问题:

由于 OS 将包含大部分 arduino 代码,是否可以将应用程序 link 添加到 OS 而无需在二进制文件中包含 OS?我的意思是在应用程序的 linking 步骤中,用它们的实际值替换对 OS 中符号的任何引用而不重新包含 OS 代码?您会向 linker 脚本添加什么?

目标是在不触及 OS 的情况下,仅在预定义的地址重新编程应用程序代码。 (重新编程停止将从 OS 代码完成,像普通引导加载程序一样对 mcu 进行自编程)

你至少有这些选项,以前都见过:

  1. 为所有 OS 函数提供固定接口。这可能是一个矢量或任何其他易于记忆的地址。每次调用都使用一个函数号作为索引。

    在您应用的链接描述文件中定义此入口点的地址。

    在头文件中使用适当的函数编号将所有 OS 函数声明为对该入口点的调用。

    类似的选择:询问这个单一函数关于索引OS函数的地址。

  2. 提供跳转 table 到所有 OS 功能。放在固定地址。

    在您的应用的链接描述文件中定义这些跳转的地址。

    在头文件中声明所有 OS 函数。

  3. 编写一个脚本,从 OS.

    的映射文件中提取所有 OS 函数的地址

    研究一下如何将这些地址包含在应用程序的链接描述文件中。扩展您的脚本以提供正确的语法。您甚至可以使用该脚本生成应用程序的链接描述文件。

    在头文件中声明所有 OS 函数。

应用程序源中的引用将由其链接描述文件中的定义解析。