_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関連の修正のみ?