这是这个问题的延续。
我正在测试是否对 .NET DLL 进行变基,NGENning 它们是否会在终端服务器的内存中为我提供更多共享代码。
但是,我的计划似乎有一个缺陷,我似乎无法找到一种工作方法来找出一组工作地址。
我认为我可以做的如下:
- 只需构建和 NGEN 一切
- 启动程序,确保所有 DLL 都已加载
- 使用LISTDLLS /R PROGRAMNAME 获取正在运行的实例的当前使用地址列表
- 使用重新映射的那些 DLL 的地址作为这些 dll 的新基地址
- UN-NGEN 一切,从 1 开始
然而,这已经变成了薛定谔的练习,因为重新定位某些 DLL 的行为显然会改变加载顺序或操作系统重新定位其他 DLL 的方式。
例如,假设在初始运行后,我有一个列表,说明 DLL A、B 和 C 需要位于地址 1000、2000 和 3000。没有提及 DLL D、E 和 F,它们也是同一个系统。大概这些是在它们当前的基地址加载的,否则我会假设 LISTDLLS 会告诉我这一点。
所以我改变了A、B、C的地址,重复一切,现在DLL C、D和E已经被重新定位。A和B现在都好了,E和F现在搬家了,C还在被洗牌。
我意识到这个练习有点徒劳,因为不管我在我的机器上发现了什么,在目标终端服务器上使用和注入的 DLL 可能会干扰这张图片,但我认为如果我至少可以确保一些DLL 可以位于其规定的基地址,然后同一程序的多个实例之间的共享代码量会增加。只是说,只是为了没有必要“提醒”我:)
由于我们所有 DLL 的原始基地址是默认值,这意味着每个 DLL(可能除了第一个加载的)都被重新定位,因此映射到页面文件,我认为可能会有高于 0 的增益。
有什么建议吗?