Linux:是否可以使用静态链接的二进制文件进行一些面向插件的编程?

假设我们有一个非常小的embedded式系统,只包含linux内核和一个静态链接的二进制文件作为init。 我们希望二进制文件能够在运行时dynamic加载外部插件

在linux上可能吗? Dlopen只能与共享库和dynamic链接一起工作,因为静态二进制文件不会将任何符号导出到外部世界,那么还有其他方法吗?

Dlopen仅适用于共享库和动态链接,因此静态二进制文件不会将任何符号导出到外部世界

使用glibc时,您可以从静态链接的二进制文件中共享库。 如果你需要你的插件来引用主要可执行文件中的符号,你必须把指针传递给插件,类似于这个 。

有没有其他方法可以做到这一点?

你也可以编写你自己的模块加载器。 Linux内核是这样做的, Xorg也是如此。

你可以运行“插件”作为子进程,并通过IPC(共享内存,管道等)进行通信。

它们会存在于自己的进程空间中,所以你不能直接调用它们的函数(另外,如果它们也是静态链接的,除了main可以到达的地方你不会有任何函数入口点),但是你可以(例如)通过命名管道发送命令,或者将数据传递到共享内存结构中。

请注意,在加载第二个二进制文件的那一刻,您已经失去了静态链接的一个主要优点(因为现在您已经加载了两个libc副本),所以您可能需要考虑只是咬住子弹并使用动态链接。 加入动态链接支持,你会烧几个100K的,但是GNU的libc大约是2M,所以如果你加载了一个插件,你已经可以节省180万美元了。 对于你加载的每个额外的插件,你可以节省2M。