c++ - 动态链接的虚拟文件

标签 c++ file dynamic linker virtual

我的问题很复杂,可能不可能解决,但我们开始吧:

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

我的问题:

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

所以这是我的问题:

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

或者使用临时文件真的没什么大不了的,因为现代操作系统的文件缓冲区足够快/足够智能,不会将所有这些文件写入磁盘? (其实linux是支持虚拟文件系统的,windows不支持...)

我希望你们能帮助我:)

最佳答案

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

它也相对容易做到,因为您只需要找到 PE 导入表,然后做动态链接器做的事情,用跳转和地址填充它。 Dll 包含与位置无关的代码,因此无需重定位。

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

关于c++ - 动态链接的虚拟文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11911109/

相关文章:

c++ - 为什么这是未定义的行为?

java - Android获取GPS数据时能否将GPS数据写入CSV文件?

c++ - Delete[] 数组破坏了我的 C++ 程序

c++ - 我不明白 C++ 中的段错误

c++ - 使用 SSE 内部函数时结果不正确

redux-form 和 Elixir/phoenix 作为后端 API 的文件附件(序列化问题)

python - 如何将文件放入 PyQt5 中的 QTableWidget 中

html - css动态图标布局无需刷新,类似amazon网站

java - 静态实例变量查找 Java

c++ - 有限的分配大小 C++