我想将共享对象作为数据文件打开并对其执行验证检查。验证是签名检查,我签署共享对象。如果验证成功,我想将当前打开的共享对象加载为适当的共享对象。
第一个问题:是否可以在签名检查期间调用dlopen
并将共享对象作为数据文件加载,以便不执行 ?根据手册页,我不相信,因为我没有看到类似于RTLD_DATA
的旗帜。
由于我将共享对象作为数据文件打开,因此我可以使用描述符。验证成功后,我想将描述符传递给dlopen
,以便动态加载程序正确加载共享对象。我不想关闭文件,然后通过dlopen
重新打开它,因为它可能会引入竞争条件(验证的文件不是打开和执行的文件)。
第二个问题:如何使用文件描述符将打开的文件传递给dlopen
,以便dlopen
执行共享对象的惯常初始化?
答案 0 :(得分:3)
在Linux上,你可能会dlopen
一些/proc/self/fd/15
文件(对于文件描述符15)。
RTLD_DATA
似乎不存在。因此,如果您需要它,您必须修补自己的动态加载程序。也许在MUSL Libc内做这件事可能不那么难。我仍然不明白为什么你需要它。
你必须以某种方式信任dlopen
- ed插件(它将在dlopen
时间运行其构造函数。)
您可以在dlopen
之前使用一些ELF解析库来分析共享对象插件,可能是libelf或libbfd
(来自binutils) ;但我仍然不明白你想做什么样的分析(你真的应该解释一下;特别是如果插件间接链接到一些不良行为软件会发生什么)。换句话说,您应该详细说明您的验证步骤。请注意,共享对象可能会覆盖自己....
或者,不要使用dlopen
而只使用mmap
您的文件(您需要解析一些ELF)。
使用某些JIT generation技术可能会有用(您可以通过某些验证的数据生成代码),例如:使用GCCJIT,LLVM或libjit等...
如果你有两个文件描述符到同一个共享对象,你可能没有任何竞争条件。