1

我有一个游戏代码(来自 ioquake3 项目),它可以即时编译部分游戏二进制文件(qvm 系统)。现在,可以通过加载先前保存的此操作的二进制文件来加速它(使用任何文件更改预防措施)。

但是,指向保存在这些二进制文件中的函数的指针不会通过会话持久化。

什么是即时更改这些的正确方法?(考虑到一个在主应用程序中有可用的汇编程序和汇编程序)

4

2 回答 2

2

这几乎就是可执行文件的普通加载器所做的。它们通常通过存储引用地址的位置表来工作,这些地址需要根据加载文件的位置进行更改。通常,它们在每个位置存储一个相对地址,因此要加载文件,您需要查看表并将基本加载地址添加到每个地址的内容中,然后在加载到内存时将结果放入图像中。

于 2010-03-07T03:45:33.820 回答
2

将相关函数指针表作为参数传递。或者,您可以使生成的代码依赖于放置在相对于代码的固定位置的数据区域。

我记得当我弄乱这些东西时,我设置了一个读/写/执行内存页面,将前半部分用于生成的代码,将后半部分用于数据。代码一旦获得控制权,将如下所示:

call l
l:
pop eax ; eax has the current eip
and eax, 0fffff000h ;round down to the page size, 4K AKA 0x1000
add eax, 800h ;now eax points at the data area

...等等。

对于大规模生成的代码,您可能希望将其存储为完整的 DLL,并利用系统提供的重定位和地址修复服务。

于 2010-03-07T03:46:32.313 回答