ARM64驱动项目链接失败:未解析外部符号__security_pop_cookie等
问题背景
编译ARM64架构的Windows驱动项目时,链接阶段出现以下未解析符号错误,但x86/x64架构编译正常:
1>wdmsec.lib(ppregstate.obj) : error LNK2001: unresolved external symbol __security_pop_cookie
1>wdmsec.lib(cmregutil.obj) : error LNK2001: unresolved external symbol __security_pop_cookie
1>wdmsec.lib(ppregstate.obj) : error LNK2001: unresolved external symbol __security_push_cookie
1>wdmsec.lib(cmregutil.obj) : error LNK2001: unresolved external symbol __security_push_cookie
Fatal error LNK1120: 2 unresolved externals
问题原因
这两个符号属于Visual Studio的缓冲区溢出保护(GS)机制,x86/x64架构下驱动编译会自动处理这些符号,但ARM64驱动环境中,默认配置可能未正确链接对应的安全cookie库,或项目GS设置与链接依赖不匹配。
可行解决方案
1. 关闭缓冲区安全检查
如果不需要GS保护,直接关闭该功能:
- 打开项目属性,依次进入「配置属性 -> C/C++ -> 代码生成」
- 将「缓冲区安全检查」设为「否(/GS-)」,重新编译链接即可。
2. 显式添加ARM64安全库依赖
若要保留GS保护,需手动链接ARM64版本的bufferoverflowu.lib:
- 进入项目属性「配置属性 -> 链接器 -> 输入」
- 在「附加依赖项」中添加
bufferoverflowu.lib,确保使用的是ARM64架构对应的库文件。
3. 验证wdmsec.lib的架构匹配性
确认当前使用的wdmsec.lib是ARM64版本:
- 用
dumpbin /headers wdmsec.lib命令查看库的目标架构,输出中需包含ARM64标识。如果是x86/x64版本,替换为ARM64版即可。
4. 直接编辑VCXPROJ配置
如果图形界面设置无效,可直接修改.vcxproj文件,在ARM64配置块中添加依赖:
<PropertyGroup Condition="'$(Platform)'=='ARM64'"> <LinkAdditionalDependencies>bufferoverflowu.lib;%(LinkAdditionalDependencies)</LinkAdditionalDependencies> </PropertyGroup>
内容的提问来源于stack exchange,提问作者Ashish Kishor

