在动态加载之前检查共享库的兼容性

时间:2011-04-13 13:03:18

标签: c linux linker dynamic-linking

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

AProgrammer的答案(或者只是导出一个带有版本号的全局变量)将起作用,但请记住,没有任何解决方案是万无一失的,也不能安全地抵御恶意插件文件。加载的模块在与程序相同的内存空间中运行,具有相同的权限,不幸的是,动态加载器将很高兴地在插件中运行全局构造函数,然后才能查询版本或自行执行任何检查。 ( Grumble 任何人都有一个链接到Global Constructors认为有害吗?)

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