다음을 통해 공유


Unresolved external __security_cookie with Platform SDK compiler

Quite a frequently asked questions.

You build your code using recent build of the platform SDK and you receive one of the following error messages at compile or link time:

Linker Tools Error LNK2001
'unresolved external symbol __security_cookie '

Linker Tools Error LNK2001
'unresolved external symbol __security_check_cookie '

Long story short, the cause of this error is that /GS switch is a default switch in the compiler shipped with the PSDK. If you don’t know what is /GS switch, here is a great article from Brandon that talks about it: https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vctchcompilersecuritychecksindepth.asp

Basically, /GS switch provides at runtime basic protection against some types of buffer overrun attacks. On functions that the compiler thinks might be subject to buffer overruns, the compiler inserts a security cookie before the return address. The security cookie is computed once at module load and its value is pushed to the stack on function entry. Then, on function exit, the compiler helper is called to make sure the cookie's value is still the same. If the value was changed, this is treated as a sign of a buffer overrun in the stack corruption.

 

To fix this problem you need to link your code to bufferoverflowU.lib. This should do it for most of applications out of there.

 

Just do

 

cl.exe a.cpp bufferoverflowU.lib

 

or

 

link a.obj bufferoverflowU.lib

 

 

This is problem-resolution type of post. I am working on a KB article on this that should be published sometime soon. It will have all details on what library and why you need to link with.

Comments

  • Anonymous
    April 18, 2007
    Is there a way i can disable the /GS switch, also where do i get the bufferoverflowU.lib..

  • Anonymous
    January 29, 2008
    It can be disabled from project properties: Project Properties > Configuration Properties > C/C++ > Code generation > Buffer security check