未解析的外部符号__guard_fids_table [重复]

Posted

技术标签:

【中文标题】未解析的外部符号__guard_fids_table [重复]【英文标题】:Unresolved external symbol __guard_fids_table [duplicate] 【发布时间】:2019-03-08 04:20:09 【问题描述】:

我正在编译一个巨大的开源解决方案(实际上是Virtualbox 6.0.4 OSE Windows 版本),并且遇到了以下链接错误(提供了命令和错误,为便于阅读而格式化)

C:/MSVS/10.0/VC/bin/link.exe’
-nologo’
-machine:x86
-Ignore:4197
-Driver
-Subsystem:NATIVE
-Incremental:NO
-Align:4096
-MapInfo:Exports
-NoD
-Release
-Debug
-Opt:Ref
-Opt:Icf
-Version:600.4
-Stub:winstub.com'
-IntegrityCheck
/Entry:DriverEntry@8
/OUT:VBoxWddm.sys
/MAPINFO:EXPORTS
/INCREMENTAL:NO
/MAP:VBoxWddm.map
/LIBPATH:C:/WinDDK/7600.16385.1/lib/wlh/i386
/LIBPATH:C:/WinDDK/8.1.1/Lib/win8/km/x86
@VBoxWddm.rsp
Creating library VBoxWddm.lib and object VBoxWddm.exp 
BufferOverflowK.lib(loadcfg.obj) : error LNK2001: unresolved external symbol __guard_fids_table
BufferOverflowK.lib(loadcfg.obj) : error LNK2001: unresolved external symbol __guard_fids_count
BufferOverflowK.lib(loadcfg.obj) : error LNK2001: unresolved external symbol __guard_flags 
VBoxWddm.sys : fatal error LNK1120: 3 unresolved externals

编译器是 VC++ 10.0(Oracle 需要这种过时的编译器来实现 COM 接口向后兼容),安装了 Windows 7 和 8.1 SDK。

我发现,__guard_fids_table 是 Windows 8.1 中引入的 Microsoft 反恶意软件控制流防护 API 的一部分。一些消息来源告诉它需要 Visual C++ 版本 14.0(即 MSVS 2015 Update 3),但是,它仍然缺乏该 API 的良好文档,所以我不能 100% 确定。

问题可能是构建系统的错误(Virtualbox OSE 6 是相当新的,并且没有经过适当的测试),或者只是需要一些额外的配置。我需要一些指导来进一步调查,因为实际上没有关于如何构建 Oracle Virtualbox 6 的官方文档,而且他们的论坛在很多年前就已经死了。

当时的主要问题是,是否可以将这些对象与所需的 VC++ 10.0 或更新的编译器,或者只是 Windows 10 SDK 链接起来。

任何人都有编译 Virtualbox 6 的经验也很棒

【问题讨论】:

您必须尝试链接一个库,该库是在确实支持__guard_fids_table的较新版本的编译器上编译的。否则,MSVC 10 不支持的功能无法在目标文件中结束。确保您正在对所有模块进行完整构建。特别是,根据错误消息,重建BufferOverflowK.lib(loadcfg.obj) BufferOverflowK 听起来像是来自 WDK 的 .LIB,而不是您可以重新编译的东西。 有没有机会混合来自 DDK 7 和 DDK 8 的 lib 文件?也许尝试在两个 ddks 的 Lib 目录中找到所有包含列出的符号名称的文件。 __guard_fids_table 等 - 这是绝对符号。 link.exe 一定明白。你使用旧的link.exe。您的解决方案 - 从新的 Visual Studio 或独立工具中获取新的构建工具并覆盖您的 MSVS/10.0/VC/bin 目录 没错,BufferOverflowK.lib 是 DDK 的一部分,无法重新编译。 VC++ 10.0 是构建系统的明确要求。它是在商业版本的 Virtualbox 中使用旧编译器构建的。可能是同时将路径传递给 WDK 7 和 8.1 的问题,这看起来像是 Makefile 中的一些错误 【参考方案1】:

如果有人感兴趣,我找到了解决方案。 Windows DDK 8.0 是 VC++ 10.0 支持的最后一个版本,应该使用它来代替 7.1 或 8.1。 DDK 7.1 声明不足以构建此特定驱动程序,并且 8.1 已经包含 Control Flow Guard API,因此 8.0 是唯一的选择

【讨论】:

以上是关于未解析的外部符号__guard_fids_table [重复]的主要内容,如果未能解决你的问题,请参考以下文章

错误 LNK2001:未解析的外部符号 LIBID_

未解析的外部符号_stricoll

未解析的外部符号__guard_fids_table [重复]

未解析的外部符号 PriorityQueue [关闭]

引用了未解析的外部符号 __imp__JNI_CreateJavaVM@12

未解析的外部符号“public:__thiscall Vector<int> [...]”