用于动态链接的虚拟文件

时间:2012-08-11 01:23:34

标签: c++ file dynamic linker virtual

我的问题非常复杂,可能无法解决,但我们走了:

使用C ++, 我正在为我的游戏项目开发通用服务器引擎。通用,因为引擎的每个部分都会在启动后动态加载。现在,游戏对象也将从基础对象继承并重载“模拟”功能。这样,每个对象都会有它的特定行为,我可以做一些我称之为“C ++ Scripting”的东西,它比解释的lua脚本文件更快。它也更有活力。 (请不要破解c ++“脚本”部分的解决方案,比如“忘记动态链接,这是疯狂的。”这种性能提升是完全必要的,因为我正在处理大型体素图)

我的问题:

确实有很多 .dll / .so文件,我想将它们打包成一个简单的存档,这样我就可以在所说的源代码上使用zlib,也可以将所有内容与纹理和声音打包在一起小“对象包”。 现在,Windows DLL API和Linux SO API将不允许我从内存地址加载dll / so文件,这是一种耻辱。(我是在那里,还是可以绕过它?))我不知道我想解压并临时保存文件系统上的那些文件,因为它们有数百到数千个,这会增加很多的加载时间。 此外,我对更多外部依赖项如boost。

不感兴趣

所以这是我的问题:

是否有跨平台方法在内存中创建具有真实路径的虚拟文件? 这样我就可以绕过硬盘的慢速IO速度。

或者使用临时文件真的没什么大不了的,因为现代操作系统的文件缓冲区快速/智能到足以不将所有这些文件写入光盘? (实际上Linux支持虚拟文件系统,但Windows不支持...)

我希望你们能在那里帮助我:)

1 个答案:

答案 0 :(得分:1)

不是winapi,这是肯定的,但你可以手动完成。您可以将其加载到内存中,填充它的导入表并调用导出的函数(在您调用DllMain之后)。我看到一个程序,其中某人实际上使用该方法创建了一个新进程...有关详细信息,请参阅PE文档,但它可以正常工作。

此外,它相对容易,因为您只需要找到PE导入表,并执行动态链接器所做的操作,用跳转和地址填充它。 Dll包含与位置无关的代码,因此不需要重定位。

它在linux上也是一样的(只使用elf结构),但如果你有一个更好的虚拟文件系统解决方案,你应该使用它。