我需要重新设置我用我的程序安装的DLL文件组,因为它是一个32位程序,地址空间现在太碎片了。还有一个问题是,由于基地址与某些DLL冲突,整个DLL在冷启动时被请求分页到RAM中,因此加载器可以对它们进行重新绑定。有些DLL是我们编译过的;其他人来自第三方。
我想要做的是在给定的一组DLL中使用工具rebase,以便DLL组占用连续的内存块。然后,在编译安装程序之前运行此工具,并将重新定义的DLL安装在应用程序的私有目录中。
据我所知,Windows SDK附带的REBASE.EXE工具确实做到了。给它一些DLL,然后重新定义它们。
不幸的是...... Windows Software Development Kit (SDK) for Windows 8 Consumer Preview说:
工具已从Windows SDK中删除了许多过时或已弃用的工具。已删除以下工具:
<剪断> ReBase.exe
现在怎么办?我不想开始使用明显过时的工具,并且将在下一版本的Windows中消失。假设我正在读这个,那么使用ReBase.exe有什么替代品?我想限制自己使用Windows SDK和/或Visual Studio附带的工具,而不是引入第三方工具和/或编写我自己的rebase代码。
或者,我是否以错误的方式处理整个问题?
答案 0 :(得分:11)
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:#[.#]
正如马克指出你要关闭ASLR,你可以使用/DYNAMICBASE:no
答案 1 :(得分:3)
不推荐使用Rebase.exe的原因是它没有以前那么有用。从Windows Vista开始,Microsoft实现了Address Space Layout Randomization,每次加载时都会移动系统DLL,也可以选择用户DLL。
如果你依靠变基来生成一个大的连续地址空间,你会感到很失望。
答案 2 :(得分:3)
更不用说对一组文件使用“REBASE.EXE -b 0x58000000 -e 0x10000 -c coffbase.txt * .dll”,只是为了生成COFFBASE文件。
换句话说,不是因为你打算现在实际修改你的文件,而是因为你想要一个准确的COFFBASE.TXT,
这样他们每次构建时都会/已经/建立了一个特定的,没有冲突的基地址。