visual-studio-2010winapiportable-executablecoffdumpbin

How can I check the LIB file version?


After reinstalling Visual Studio 2010, I recompiled the code and encountered the following error:

Error 'LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt'

A solution mentioned that the lib file is incompatible and I need to install Visual Studio 2010 SP1. I did that, and now it has been solved.

I am wondering how can I check whether a lib file is created by SP1 or not? I tried dumpbin, but I cannot find the version in its result.


Solution

  • It was not an incompatibility with your LIB file that caused the problem here, so checking the version of the linker that created it would not be a solution anyway.

    The issue is that cvtres.exe (used internally by the linker toolchain) depends on a particular DLL (msvcr100_clr0400.dll) shipped with VS 2010 RTM. When you update to a later version of the .NET Framework (e.g., by installing .NET 4.5 or installing a later version of VS), this DLL is replaced. That stops cvtres.exe from working.

    The reason why installing VS 2010 SP1 fixes it is because it actually modifies the cvtres.exe application to break the dependency. And now that all pieces of the linker toolchain work, you can compile and link the code without error.

    Of course, there are other problems you can have when you start mixing libraries created by different versions of the compiler and/or linker. They aren't guaranteed to create 100% compatible output, so mixing them is not supported (at least not between major versions, I'm uncertain about how this rule applies to service packs).

    In general, it's best to just recompile all libraries whenever you update your build system. The only time you wouldn't do this is if you didn't have the source code, in which case, you need to be very careful about updating your build system, lest you introduce gratuitous incompatibilities.

    As far as determining the version of the linker that prepared a particular binary, using dumpbin.exe (included with the SDK) is exactly the correct approach. For static libraries, run the following command from the Visual Studio SDK Command Prompt:

    dumpbin /rawdata:1 MyLibrary.lib
    

    You'll see the assembly manifest, which will include the full path to the compiler used to build the library as well as the version of the CRT that it depends upon.

    For dynamic libraries (i.e., DLLs) and executables, run the following command:

    dumpbin /headers MyApp.exe
    

    Look under the "Optional Header Values" section (not actually optional) for the version of the linker, along with a timestamp of when it was generated.

    Note that you're very unlikely to find this information in release builds of a library or binary.