什么是REBASE.EXE的替代?

我需要重新绑定与我的程序一起安装的DLL文件组,因为这是一个32位程序,现在地址空间太碎了。 另外还有一个问题,就是在冷启动时需要将整个DLL分页到RAM中,这样加载器就可以将它们重新绑定,因为与某些DLL的基地址冲突。 有些DLL是我们编译的; 其他人来自第三方。

我想要做的是有一个工具重新绑定给定的一组DLL,这样的DLL组占用连续的内存块。 然后,这个工具将在编译安装程序之前运行,而重新发布的DLL将被安装在应用程序的专用目录中。

据我所知,Windows SDK附带的REBASE.EXE工具确实做到了。 给它一些DLL,并重新启动它们。

不幸的是… Windows 8 Consumer Preview的Windows软件开发工具包(SDK)说:

工具许多过时或已弃用的工具已从Windows SDK中删除。 以下工具已被删除:

<snip> ReBase.exe

现在怎么办? 我不想开始使用显然已经过时的工具,它将在下一个版本的Windows中消失。 假设我正在阅读这个权利,什么是使用ReBase.exe的替代品? 我想限制自己使用Windows SDK和/或Visual Studio附带的工具,而不是引入第三方工具和/或编写自己的rebase代码。

或者,我以错误的方式接近整个问题?

editbin.exe自带有VS2010,并有一个/ REBASE选项。

 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>editbin Microsoft (R) COFF/PE Editor Version 10.00.40219.01 Copyright (C) Microsoft Corporation. All rights reserved. usage: EDITBIN [options] [files] options: /ALLOWBIND[:NO] /ALLOWISOLATION[:NO] /BIND[:PATH=path] /DYNAMICBASE[:NO] /ERRORREPORT:{NONE|PROMPT|QUEUE|SEND} /HEAP:reserve[,commit] /LARGEADDRESSAWARE[:NO] /NOLOGO /NXCOMPAT[:NO] /REBASE[:[BASE=address][,BASEFILE][,DOWN]] /RELEASE /SECTION:name[=newname][,[[!]{CDEIKOMPRSUW}][A{1248PTSX}]] /STACK:reserve[,commit] /SUBSYSTEM:{BOOT_APPLICATION|CONSOLE|EFI_APPLICATION| EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER| NATIVE|POSIX|WINDOWS|WINDOWSCE}[,#[.##]] /SWAPRUN:{[!]CD|[!]NET} /TSAWARE[:NO] /VERSION:#[.#] 

正如Mark指出的那样,您需要关闭ASLR,您可以使用/DYNAMICBASE:no来关闭ASLR /DYNAMICBASE:no

Rebase.exe被弃用的原因是它不像以前那样有用。 从Windows Vista开始,Microsoft实现了地址空间布局随机化 ,它可以在每次加载系统DLL时移动系统DLL,也可以选择用户DLL。

如果你指望重新生成一个大的连续的地址空间,你会感到失望。

更不要说对一组文件使用“REBASE.EXE -b 0x58000000 -e 0x10000 -c coffbase.txt * .dll”,只是为了生成COFFBASE文件。
换句话说,不是因为你打算现在重新绑定你的文件,而是因为你想要一个精确的COFFBASE.TXT,
以便每次构建它们时都已经/将建立一个特定且不冲突的基地址。