_BIND_TO_CURRENT_VCLIBS_VERSIONについてまじめに調べてみる

時間ができたというか、眠くて仕事ができないので(???)、現実逃避気味に、調べてみることにした。

まず、_BIND_TO_CURRENT_VCLIBS_VERSIONマクロは、誰が見ているのかというと、これは、crtassem.h (Libraries Assembly information)というヘッダ。基本的に、定義されていない場合に、0として定義し直して、結果的に、_BIND_TO_CURRENT_CRT_VERSIONというマクロを定義している。

#if !defined(_BIND_TO_CURRENT_VCLIBS_VERSION)
  #define _BIND_TO_CURRENT_VCLIBS_VERSION 0
#endif

#if !defined(_BIND_TO_CURRENT_CRT_VERSION)
  #if _BIND_TO_CURRENT_VCLIBS_VERSION
    #define _BIND_TO_CURRENT_CRT_VERSION 1
  #else
    #define _BIND_TO_CURRENT_CRT_VERSION 0
  #endif
#endif

つまり、ここだけを見ると、

_BIND_TO_CURRENT_VCLIBS_VERSION≒_BIND_TO_CURRENT_CRT_VERSION

っぽい。

あとは、

#ifndef _CRT_ASSEMBLY_VERSION
#if _BIND_TO_CURRENT_CRT_VERSION
#define _CRT_ASSEMBLY_VERSION "9.0.30729.1"
#else
#define _CRT_ASSEMBLY_VERSION "9.0.21022.8"
#endif
#endif

#ifndef __LIBRARIES_ASSEMBLY_NAME_PREFIX
#define __LIBRARIES_ASSEMBLY_NAME_PREFIX "Microsoft.VC90"
#endif

というすてきな定義が直書きされている。なるほど。

次に、crtdefs.hを見てみると、こいつは、先ほど定義された_BIND_TO_CURRENT_CRT_VERSIONを見ている。

#if _BIND_TO_CURRENT_CRT_VERSION
  #if !defined(_M_CEE_PURE)
    #if defined(_M_IX86)
      #pragma comment(linker, "/include:__forceCRTManifestCUR")
    #else
      #pragma comment(linker, "/include:_forceCRTManifestCUR")
    #endif
  #else
      #pragma comment(linker, "/include:?_forceCRTManifestCUR@@$$Q3HA")
  #endif
#endif

#ifdef _M_IX86

#ifdef _DEBUG
#pragma comment(linker,"/manifestdependency:\"type='win32' " \
    "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT' "  \
    "version='" _CRT_ASSEMBLY_VERSION "' "                   \
    "processorArchitecture='x86' "                           \
    "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' " \
    "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT' "       \
    "version='" _CRT_ASSEMBLY_VERSION "' "                   \
    "processorArchitecture='x86' "                           \
    "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#endif

#endif	/* _M_IX86 */

ここがどうやら、総本山のようだ。結局、pragmaでリンカのオプションを指定して、manifestを出力している。リンクされるライブラリのカラクリはこれだけのようだ。

ちなみに、use_ansi.hにも同じようなコードがある。

逆にこれだけの模様。ということは、SP1では、セキュリティ関連の修正が施されているだけで、ライブラリは完全コンパチと考えてよいのだろうか。tr1関連の修正のみ?