Using Visual Studio 2012, I was building from the command line a software which was built until now using an older version (guess it was Visual Studio 2005). There were of course many things I had to change in the code itself (so much for portability…). And of course I had to upgrade the project in the solutions to VS2012 (using the devenv /upgrade command).
After converting the projects and modifying the code, I got the following error messages on a few projects:
error LNK2026: module unsafe for SAFESEH image.
fatal error LNK1281: Unable to generate SAFESEH image.
This means that the linker was started with the option meaning /SAFESEH “image has safe exception handlers” (also note that we only got this because we’re still building 32bit targets). The error occurs because some input modules were not compatible with the safe exception handlers feature of the linker. In our case it was some third party lib files for which I did not have the source code. These lib files are not be compatible with safe exception handlers is because they were created with an older version of the Visual C++ compiler.
But this is easy to fix. You just need to tell the linker not to produce an image with a table of safe exceptions handlers even if it thinks that all modules are compatible with the safe exception handling feature.
If you work in the Visual Studio Editor, you can right-click on your DLL project, go to Properties > Linker > Advanced and set “image has safe exception handlers” to No.
If like me you’re working from the command line, you can edit the .vcxproj file by opening it and searching for the <link> tags. Add the following to each <link> tag (there will be one per target e.g. one for debug and one for release):
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
It doesn’t matter where exactly you add it, it just needs to be between <link> and </link>.
If you call the linker yourself, you can also add /SAFESEH:NO to the command line.
After making this change, you can build your project again and the error will be gone.