用于动态链接的虚拟文件

Virtual Files for dynamic linking

本文关键字:虚拟 文件 链接 动态 用于      更新时间:2023-10-16

我的问题非常复杂,可能是不可能的,但我们来了:

使用C++,我目前正在为我的一个游戏项目开发通用服务器引擎。通用,因为引擎的每个部分在启动后都会动态加载。现在,游戏对象也将继承自基本对象,并具有重载的"模拟"功能。这样,每个对象都会有它的特定行为,我可以做一些我称之为"C++脚本"的事情,这比解释的lua脚本文件快得多。此外,它更具动态性。(请不要使用会杀死 c++ "脚本"部分的解决方案,例如"忘记动态链接,这太疯狂了"。这种性能提升是完全必要的,因为我正在使用大型体素地图)

我的问题:

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

所以这是我的问题:

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

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

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

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

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

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