REBASE.EXE 有什么替代品?

10

我需要重新安装我程序所需的一组DLL文件,因为它是32位程序,地址空间现在太过分散了。另外还有这个问题:由于一些DLL与基址冲突,所有的DLL都被要求页面调入RAM中进行重定位,使得整个DLL都被重新映射到内存上。其中一些DLL是我们编译的,其他的来自第三方。

我想要的是一个工具可以将一组给定的DLL文件重新映射,使得这一组DLL占据一个连续的内存块。这个工具将在安装程序之前运行,并且这些映射后的DLL文件将被安装在应用程序的私有目录中。

据我所知,Windows SDK附带的REBASE.EXE工具正是做这件事的。只要给它一些DLL文件,它就可以重新映射。

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

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

<snip> ReBase.exe

那现在怎么办?我不想开始使用一个明显已经过时并且将在下一个版本的Windows中消失的工具。假定我的理解是正确的,那么用于替换ReBase.exe的工具是什么? 我想使用与Windows SDK和/或Visual Studio相同的工具,而不是引入第三方工具和/或编写自己的重映射代码。

或者说,我是用错误的方法来解决这个问题吗?


1
你可以继续使用rebase。它仍然有效,而且不会停止工作。 - David Heffernan
@DavidHeffernan:根据那份自述文件,一旦我们开始使用Windows 8 SDK,它就会停止工作,因为它不会存在,这是正确的吗? - James Johnston
1
还有,我在msdn.microsoft.com上找不到REBASE.EXE的文档。有相关链接吗? - James Johnston
您已经拥有rebase.exe。您可以将其用于在Windows 8上运行的DLL文件。 - David Heffernan
太糟糕了,没有像REBASE.EXE那样的详细输出。 - deltanine
3个回答

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:#[.#]

就像Mark指出的那样,你需要关闭ASLR,可以通过使用/DYNAMICBASE:no来实现。


2
EDITBIN /REBASE选项可以很好地完成任务。而且MSDN显示它在Visual Studio 11中有EDITBIN的文档,所以我不认为他们会很快删除它。显然他们正在弃用和删除Windows 8 SDK中的REBASE.EXE:它重复了EDITBIN的功能!我不确定为什么其他人认为重新定位的需要完全过时了... - 不是这样的。很遗憾,许多在线重新定位教程仍然提到REBASE.EXE... - James Johnston
2
太糟糕了,editbin不像rebase.exe那样生成详细输出。 - deltanine

3

更不用说使用“REBASE.EXE -b 0x58000000 -e 0x10000 -c coffbase.txt *.dll”对一组文件进行操作,只是为了生成COFFBASE文件。
换句话说,这并不是因为您现在想要重新定位文件,而是因为您想要一个准确的COFFBASE.TXT,
这样每次构建它们时,它们将/已经以特定且不冲突的基地址构建。


3
Rebase.exe不再使用的原因是它不如以前那么有用。从Windows Vista开始,Microsoft实现了地址空间布局随机化,每次加载系统DLL时都会将其移动,还可以选择性地移动用户DLL。
如果你指望重新定位来生成一个大的连续地址空间,那你会失望的。

1
我们的一些客户使用Windows XP,该系统没有ASLR。编译的DLL也没有启用ASLR,因此即使在像Vista/7这样的ASLR操作系统上,它们也不会加载ASLR。(我不会篡改系统DLL,即使在带有ASLR的Windows 7上,它们仍位于一个相对连续的空间中。) - James Johnston
2
@James:如果你的目标是Windows XP,一个已经过时的操作系统,那么使用Windows SDK中的遗留/废弃工具是完全有道理的。这就是David在问题评论中试图告诉你的。 - Cody Gray
3
这条评论非常老,但是对于未来的访问者,@AdrianMcCarthy是错误的。Consecutive基于DLL的文件不保证按顺序加载。 - Mike Caron
@MikeCaron,我刚看到Raymond Chen的博客文章,他正是在说这个问题,这是促使你留下评论的原因吗? - Mark Ransom
@MikeCaron:是的,我也看到了最近的Raymond Chen的帖子。我会删除我的旧评论,以免混淆任何人。 - Adrian McCarthy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接