/BASE(基址)

指定程序的基址。

语法

/BASE:{address[,size] | @filename,key}

注解

备注

出于安全原因,Microsoft 建议使用 /DYNAMICBASE 选项,而不是为可执行文件指定基址。 /DYNAMICBASE 使用 Windows 的地址空间布局随机化 (ASLR) 功能生成可在加载时随机变基的可执行映像。 默认情况下,/DYNAMICBASE 选项处于启用状态。

/BASE 链接器选项为程序设置基址。 它替代了 EXE 或 DLL 文件的默认位置。 EXE 文件的默认基址是 0x400000(对于 32 位映像)或 0x140000000(对于 64 位映像)。 对于 DLL,默认基址是 0x10000000(对于 32 位映像)或 0x180000000(对于 64 位映像)。 在不支持地址空间布局随机化 (ASLR) 的操作系统上,或者当设置了 /DYNAMICBASE:NO 选项时,操作系统首先尝试在其指定的或默认的基址处加载程序。 如果那里没有足够的可用空间,系统将重新定位程序。 为了防止重新定位,请使用 /FIXED 选项。

如果 address 不是 64K 的倍数,链接器会发出错误。 你可以选择指定程序的大小。 如果程序不适合指定的大小,链接器会发出警告。

在命令行上,指定基址的另一种方法是使用基址响应文件。 基址响应文件是一个文本文件,它包含程序使用的所有 DLL 的基址和可选大小,以及每个基址的唯一文本键。 若要使用响应文件指定基址,请使用 at 符号 (@),后跟响应文件的名称 filename,再跟一个逗号,然后是要在文件中使用的基址的 key 值。 链接器在指定路径中查找 filename,如果未指定路径,则在 LIB 环境变量中指定的目录中查找。 filename 中的每一行代表一个 DLL,语法如下:

keyaddress [size] ;comment

key 是一个字母数字字符串,不区分大小写。 它通常是 DLL 的名称,但这不是必需的。 key 后跟一个 C 语言、十六进制或十进制表示法的基 address 和一个可选的最大 size。 所有三个参数都由空格或制表符分隔。 如果指定的 size 小于程序所需的虚拟地址空间,链接器会发出警告。 comment 由分号 (;) 指定,可以在同一行或单独的行上。 链接器忽略从分号到行尾的所有文本。 下面的示例展示了此类文件的一部分内容:

main   0x00010000    0x08000000    ; for PROJECT.exe
one    0x28000000    0x00100000    ; for DLLONE.DLL
two    0x28100000    0x00300000    ; for DLLTWO.DLL

如果包含这些行的文件称为 DLLS.txt,以下示例命令将应用此信息:

link dlltwo.obj /dll /base:@dlls.txt,two

设置基址的另一种方法是在 NAMELIBRARY 语句中使用 BASE 参数。 同时使用 /BASE/DLL 选项等效于 LIBRARY 语句。

在 Visual Studio 开发环境中设置此链接器选项

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

  2. 选择“配置属性”>“链接器”>“高级”属性页。

  3. 修改“基址”属性。

以编程方式设置此链接器选项

另请参阅

MSVC 链接器参考
MSVC 链接器选项