“无法解析外部符号 __security_cookie”问题解决

编译VC工程时出现了标题所示问题,资料搜索一下,在微软网站找到答案了,解决方法如下:
1)选择“项目”-》“属性”-》“C/C++”-》“代码生成”-》“缓冲区安全检查”,设为“否”
2)选择“项目”-》“属性”-》“链接器”-》“输入”-》“附加依赖项”,增加”bufferoverflowU.lib”
然后编译工程,解决问题。
下面是微软的原文,说的很冗长,但是很直接!

在 Windows Server 2003 Service Pack 1 通过 Win 32 软件开发工具包 (SDK) 或 Windows Server 2003 Driver Development Kit (DDK) 生成源代码时可能会收到 " 链接器工具错误 LNK 2001 " 错误信息

文章编号 : 894573
最后修改 : 2007年3月27日
修订 : 1.2

症状

生成 32 位源代码或 64 位代码源代码在编译时或在链接时,您可能收到以下错误信息之一:

错误 1
链接器工具错误 LNK 2001
无法解析外部符号 __security_cookie ' '
错误 2
链接器工具错误 LNK 2001
无法解析外部符号 __security_check_cookie ' '
您以生成代码, 在 Windows Server 2003 Service Pack 1 使用或者 Microsoft Win 32 软件开发工具包 (SDK) 对于 Microsoft Windows Server 2003 Service Pack 1 或 Microsoft Windows Server 2003 Driver Development Kit (DDK)。

原因

在 Microsoft Visual Studio 2002, 新编译器开关名为 " / GS " 被引入到 Microsoft Visual C++ 编译器。 当设置 “/ GS” 开关,编译器插入编译代码中缓冲区超限检测代码。

编译器函数, 编译器可能受到缓冲区溢出,在栈上插入安全 Cookie 之前返回地址。 安全 Cookie 是计算一个模块加载时间。 在函数上安全 Cookie 值被推到堆栈。 函数退出, 上编译器 Helper 调用来确保的 Cookie 值是仍相同。 如果值更改, 这视为如符号是缓冲区溢出堆栈损坏中。 因此, 您可以检测某些直接缓冲区溢出返回地址中。

即使 / GS 开关已得到显著改进和 Visual Studio 2005, Visual Studio 2003 中 / GS 开关保护用户代码免受所有可能缓冲区溢出安全攻击 ,但是/ GS 开关并不有助于防止用户代码从所有可能缓冲区溢出安全攻击。 因小性能影响通过 / GS 开关, 新版本的 VisualC++ 编译器自动设置 / GS 切换 " " " "。 当 / GS 开关设置, 应用程序接收缓冲区溢出增强保护在运行时 " "。 这可能大大减少该应用程序是容易受到攻击。

默认情况下, 设置 VisualC++ 编译器所附带 Platform SDK 用于 Windows Server 2003 Service Pack 1 / GS 开关 " "。 源代码编译时编译器引入函数上堆栈上安全 Cookie, 插入引用到代码。 然后, 函数退出上检查是安全 Cookie 值。 此外, PlatformSDK 中的大多数库已生成与 / GS 开关设置 " "。 库已引用是以提供所需程序代码 / GS 切换增强保护运行时 " "。

VisualStudio, 用于代码中 / GS 开关位于 C 运行时库 " "。 这是由链接器, 请求中默认库。 但是, 版本所附带 PlatformSDK C 运行时库有关 VisualStudio 没有相同代码作为 C 运行时库。 发生用户构建应用程序和服务可针对不同模式是操作系统此差异是因为允许 PlatformSDK。 对安全 Cookie 添加到编译代码验证不得不以不同方式执行。 不同方式取决于什么操作系统模式服务或应用程序中运行。 它因此, 已决定来提供三库实现安全 Cookie 的验证。
bufferoverflowU.lib 此库实现功能用于安全 Cookie 验证一起使用以用户模式和在使用 Win32API 应用程序。 大多数应用程序链接到此库。
bufferoverflowK.lib 此库实现对工作安全 Cookie 检查是操作系统内核模式中。 服务和子系统在内核模式运行一定要链接到此库。
bufferoverflow.lib 该库在用户模式实现安全 Cookie 验证一起使用的功能。 由于 bufferoverflow.lib 在服务和应用不使用 Win32API 中可用但是, bufferoverflow.lib 与不同在 bufferoverflowU.lib。

解决方案

要解决错误是由链接器, 引发您需要通过之一以前提到 bufferoverflow*.lib 库链接项目。 例如, 下列程序是一个简单程序, 可通过使用平台 SDK 生成。
#include 
#include

void mymethod(char* szIn)
{
char szBuf[10];
strcpy(szBuf, szIn);
puts(szBuf);
}
int main(int argc, char* argv[])
{
if(argc>1)
mymethod(argv[1]);
}

以下代码示例显示正确编写代码要求对缓冲区溢出增强保护。 VisualC++ 编译器向编译代码添加增强保护。 无法编译代码链接因为链接器无法解析对下列引用:
__security_cookie
__security_check_cookie
>cl a.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 14.00.40310.32 for AMD64
Copyright (C) Microsoft Corporation. All rights reserved.

a.cpp
Microsoft (R) Incremental Linker Version 8.00.40310.31
Copyright (C) Microsoft Corporation. All rights reserved.

/out:a.exe
a.obj
a.obj : error LNK2019: unresolved external symbol __security_cookie referenced in function "void __cdecl mymethod(char *)" (?mymethod@@YAXPEAD@Z)
a.obj : error LNK2019: unresolved external symbol __security_check_cookie referenced in function "void __cdecl mymethod(char *)" (?mymethod@@YAXPEAD@Z)
a.exe : fatal error LNK1120: 2 unresolved externals
要解决这些错误, 您需要指定链接器必须也使用 bufferoverflowU.lib。 这假定应用程序面向用户模式, 可使用 Win32API。
>cl a.cpp bufferoverflowU.lib
Microsoft (R) C/C++ Optimizing Compiler Version 14.00.40310.32 for AMD64
Copyright (C) Microsoft Corporation. All rights reserved.

a.cpp
Microsoft (R) Incremental Linker Version 8.00.40310.31
Copyright (C) Microsoft Corporation. All rights reserved.

/out:a.exe
a.obj
bufferoverflowU.lib
>
如果您使用两步生成过程, 应用以下代码示例。
>cl –c a.cpp bufferoverflowU.lib
Microsoft (R) C/C++ Optimizing Compiler Version 14.00.40310.32 for AMD64
Copyright (C) Microsoft Corporation. All rights reserved.

a.cpp

>link a.obj bufferoverflowU.lib
Microsoft (R) Incremental Linker Version 8.00.40310.31
Copyright (C) Microsoft Corporation. All rights reserved.

>


状态

Microsoft 已确认这是 " 适用于 " 一节中列出 Microsoft 产品中存在问题。


参考

有关: / GS 缓冲区安全检查在 VisualC++ 编译器选项, 请访问以下 Microsoft Developer Network (MSDN) Web 站点 " "
http://msdn2.microsoft.com/en-us/library/8dbf701c(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/8dbf701c(vs.71).aspx)
有关编译器安全检查, 请访问以下 MSDN 网站:
http://msdn2.microsoft.com/en-us/library/aa290051(VS.71).aspx (http://msdn2.microsoft.com/en-us/library/aa290051(VS.71).aspx)



这篇文章中的信息适用于:
Microsoft Platform Software Development Kit-January 2000 Edition 当用于
    Microsoft Windows Server 2003 Service Pack 1
Microsoft Windows Server 2003 Driver Development Kit 当用于
    Microsoft Windows Server 2003 Service Pack 1


关键字: 
kbtshoot kbprb KB894573 KbMtzh kbmt

你可能感兴趣的:(WINDOWS驱动设计)