嵌入式系统:静态或动态链接

Embedded systems: static or dynamic linking

对于程序在微控制器上独立运行的嵌入式系统:

程序总是静态链接的吗?或者在某些情况下它可能是动态链接的?

来自Wikipedia

a dynamic linker is the part of an operating system that loads and links the shared libraries needed by an executable when it is executed (at "run time"), by copying the content of libraries from persistent storage to RAM, and filling jump tables and relocating pointers.

所以这意味着动态链接只有在以下情况下才有可能:
1) 你有某种 OS
2) 你有某种持久存储/文件系统。

在裸机微处理器上通常不是这种情况。

简单地说:如果微控制器上有像Linux运行这样的成熟操作系统,那么动态linking是可能的(并且很常见)。

如果没有这样的 OS,您很可能会使用静态 linking。为此,linker 将(基本上)不仅 link 模块和库,而且还包括由 OS 程序加载器完成的功能。

让我们暂时停留在这些(较小的)嵌入式系统上。

除了静态或动态 linking 之外,linker 还进行搬迁。这确实 - 简单地说 - 将程序的内部(相对)地址更改为目标设备上的绝对地址。

它在简单的嵌入式系统上并不常见,主要是因为操作系统(如果有)既不需要也不支持它。动态 linking 意味着一定数量的运行时操作系统支持。

嵌入式系统 RTOS VxWorks 支持动态 linking,因为它可以在运行时从网络或文件系统加载和 link 部分 linked 目标代码。同样,较大的嵌入式 RTOS(例如 QNX)支持动态 linking,嵌入式 Linux 也是如此。

所以是的,大型嵌入式系统可能支持动态 linking。在许多情况下,它主要用作将 link LGPL 许可代码授予闭源应用程序的一种方式。它还可以用作简化和最小化部署更改和更新到大型系统的影响的一种方法。