c++ - 如何在 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
解决方案
/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>
。
推荐阅读
- ios - 如何在 Swift 中将 UITextField 中的数据用作数组?
- blockchain - Electrum 服务器方法:“blockchain.scripthash.subscribe”
- bash - 如何打印代理并将其添加到服务器?
- bash - 带有时间戳的批处理间隔屏幕截图
- css - CSS 在服务器上的 django site-admin 中不起作用
- laravel-5.8 - ReferenceError:未定义显示框
- spring - 本地主机 Cookie 域
- bash - 如何在单个 shell 脚本中执行更改目录并并行执行两个程序?
- android - 从 androidTest 读取 json 文件
- python - Django 管理员创建表单内联 OneToOne