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

时间:2011-12-15 22:23:27

标签: c linux plugins dlopen

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

在linux上有可能吗? Dlopen仅适用于共享库和动态链接,因为静态二进制文件不会将任何符号导出到外部世界,所以有没有其他方法可以做到这一点?

2 个答案:

答案 0 :(得分:4)

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

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

请注意,当您加载第二个二进制文件时,您已经失去了静态链接的一个主要好处(因为现在您已经加载了libc的两个副本),所以您可能只想考虑咬子弹和使用动态链接。你会在添加动态链接支持时刻录几个100K,但GNU libc大约是2M,所以如果你加载了一个插件,你已经节省了大约180万美元;并且对于您加载的每个附加插件,您节省了大约2M。

答案 1 :(得分:1)

  

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

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

  

还有其他办法吗?

您也可以编写自己的模块加载器。 Linux内核执行此操作,Xorg也是如此。