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

问题描述:

假设我们有一个非常小的嵌入式系统,只包含linux内核和一个静态链接的二进制文件作为init。我们希望二进制文件能够在运行时动态加载外部插件。Linux:是否可以使用静态链接的二进制文件进行一些面向插件的编程?

是否可以在Linux上? Dlopen仅适用于共享库和动态链接,因此静态二进制文件不会将任何符号导出到外部世界,那么还有其他方法可以实现吗?

的dlopen只与共享库和动态链接的原因静态二进制工作原理不任何符号导出到外面的世界

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

是否有任何其他方式做到这一点?

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

+0

我是否能够通过C++类的成员函数到插件中呢?例如通过传递一个指向extern C函数的指针来分配一个C++类并返回一个void指针给它?我不认为它可以自行工作 - 插件不会知道成员函数符号,但有没有办法从插件内部访问它们? – Zbigh1 2011-12-16 08:23:55

你可以运行“插件”的子进程,并交流了IPC(共享内存,管道,等等)。

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

注意,你已经失去的静态链接的主要好处之一(因为现在你有你的libc装的一分式两份),所以你可能要考虑只是咬咬牙,使用动态链接。你会烧几100K在加入动态链接支持,但GNU libc是2M左右,所以如果你加载一个插件,你的储蓄已经获得也许1.8M;对于您加载的每个附加插件,您都节省了大约2M。