首页 > 解决方案 > 如何在 msbuild vcxproj 中禁用 DYNAMICBASE

问题描述

我想/DYNAMICBASE:no通过 msbuild 用来编译项目的 vcxproj 文件将链接器选项传递给 msvc 链接器。

如果有人想复制我的失败,我正在使用这个 vcxproj 文件来编译 bitcoind,使用这个命令来构建项目: msbuild bitcoind/bitcoind.vcxproj /p:Platform=x64 /p:Configuration=Release /t:build 虽然项目在dumpbin \headers针对已编译的 exe 运行时成功构建,但我得到的输出包含:

8160 DLL characteristics
  High Entropy Virtual Addresses
  Dynamic base
  NX compatible
  Terminal Server Aware

我试图根据“将 /highentropyva- 从 MSBuild 命令行或项目文件传递给 CSC 编译器”来修改 vcxproj 文件。请注意,下面的更改还包括HighEntropyVA因为我想验证这只是设置动态库的问题。

  <PropertyGroup Label="Globals">
    <FileAlignment>
      <HighEntropyVA>False</HighEntropyVA>
    </FileAlignment>
    <Link>
      <DynamicBase>False</DynamicBase>
    </Link>
    <ProjectGuid>{D4513DDF-6013-44DC-ADCC-12EAF6D1F038}</ProjectGuid>
  </PropertyGroup>

我还尝试使用“如何通过命令行将链接器选项传递给 msbuild?”的答案来完成这项工作。由此我创建了以下道具文件:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemDefinitionGroup>
    <Link>
       <DynamicBase>False</DynamicBase>
       <HighEntropyVA>False</HighEntropyVA>
    </Link>
  </ItemDefinitionGroup>
</Project>

然后使用以下命令添加到构建中: msbuild bitcoind/bitcoind.vcxproj /p:Platform=x64 /p:Configuration=Release /t:build /p:ForceImportBeforeCppTargets=profile.props

标签: c++msbuildlinkerbitcoinaslr

解决方案


/DYNAMICBASE要在文件中关闭,请.vcxproj在列表前插入以下内容<ItemGroup>

  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <Link>
      <RandomizedBaseAddress>false</RandomizedBaseAddress>
    </Link>
  </ItemDefinitionGroup>

要将其应用于所有版本,而不仅仅是发布 x64,请删除该Condition=部分。

/DYNAMICBASE关闭时,/HIGHENTROPYVA无效,尽管特征位仍可能在标头中设置。要关闭它,<AdditionalOptions>/HIGHENTROPYVA:NO%(AdditionalOptions)</AdditionalOptions>请在该行旁边添加<RandomizedBaseAddress>


推荐阅读