用文件描述符调用dlopen?

时间:2013-04-24 03:18:12

标签: linux shared-libraries dlopen

我想将共享对象作为数据文件打开并对其执行验证检查。验证是签名检查,我签署共享对象。如果验证成功,我想将当前打开的共享对象加载为适当的共享对象。

第一个问题:是否可以在签名检查期间调用dlopen并将共享对象作为数据文件加载,以便不执行 ?根据手册页,我不相信,因为我没有看到类似于RTLD_DATA的旗帜。

由于我将共享对象作为数据文件打开,因此我可以使用描述符。验证成功后,我想将描述符传递给dlopen,以便动态加载程序正确加载共享对象。我不想关闭文件,然后通过dlopen重新打开它,因为它可能会引入竞争条件(验证的文件不是打开和执行的文件)。

第二个问题:如何使用文件描述符将打开的文件传递给dlopen,以便dlopen执行共享对象的惯常初始化?

1 个答案:

答案 0 :(得分:3)

在Linux上,你可能会dlopen一些/proc/self/fd/15文件(对于文件描述符15)。

RTLD_DATA似乎不存在。因此,如果您需要它,您必须修补自己的动态加载程序。也许在MUSL Libc内做这件事可能不那么难。我仍然不明白为什么你需要它。

你必须以某种方式信任dlopen - ed插件(它将在dlopen时间运行其构造函数。)

您可以在dlopen之前使用一些ELF解析库来分析共享对象插件,可能是libelflibbfd(来自binutils) ;但我仍然不明白你想做什么样的分析(你真的应该解释一下;特别是如果插件间接链接到一些不良行为软件会发生什么)。换句话说,您应该详细说明您的验证步骤。请注意,共享对象可能会覆盖自己....

或者,不要使用dlopen而只使用mmap您的文件(您需要解析一些ELF)。

使用某些JIT generation技术可能会有用(您可以通过某些验证的数据生成代码),例如:使用GCCJITLLVMlibjit等...

如果你有两个文件描述符到同一个共享对象,你可能没有任何竞争条件。