【问题标题】:check compatability of a shared library before dynamically loading it在动态加载共享库之前检查它的兼容性
【发布时间】:2011-04-13 13:03:18
【问题描述】:

我有一个程序和一堆“插件”(共享库),主程序在运行时根据请求加载。

插件可以访问程序的所有内部全局数据结构/功能,因此每次内部数据结构更改时都没有保留版本的选项。

我正在寻找一种方法,即主程序可以检查它尝试加载的插件是否受支持(使用适当的数据结构)。

有没有你能想到的创造性方法,这样做?

【问题讨论】:

  • 从库中导出一个getVersion函数——加载、调用它,根据这个版本确定兼容性。

标签: c linux linker dynamic-linking


【解决方案1】:

插件中的函数返回有关其支持的协议版本的信息(插件的协议不限于它提供的内容,它也是调用程序所需的内容。)

【讨论】:

    【解决方案2】:

    AProgrammer 的回答(或简单地导出带有版本号的全局变量)将起作用,但请记住,没有任何解决方案是万无一失或安全的,可以抵御恶意插件文件。加载的模块与您的程序在相同的内存空间中运行,具有相同的权限,不幸的是,动态加载器会在您能够查询版本或自己执行任何检查之前愉快地在插件中运行全局构造函数。 (抱怨有人知道 Global Constructors 被认为是有害的吗?)

    无论如何,如果插件架构是您的设计,我强烈建议您禁止在插件规范中使用任何全局构造函数。当然,您不能在运行时强制执行此操作,但至少您可以责怪任何违反合同的插件作者。

    【讨论】:

    • 如果您想防范恶意用户提供的代码,您需要在虚拟机中运行该代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多