Динамический рантайм в VS2008. Вопросы безопасности.
Загадка: если установить SP1 на Visual Studio 2008, какой рантайм будет требовать собранный такой версией студии бинарь? Отгадка: рантайм от Visual Studio 2008 без SP1 (9.0.21022.8). То есть плевать на все фиксы сделанные в SP1, плевать на Security Update — скомпиленные вами бинари продолжают юзать дырявый рантайм.
Обнаружилось абсолютно случайно, когда пришлось слинковаться с либой, у которой был другой рантайм (9.0.30729.1). В итоге генерился прикольный манифест в exe файле:
<dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> </dependentAssembly> </dependency> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> </dependentAssembly> </dependency>
И на XP запустить не выходило, потому что надо было два рантайма.
Как же заставить слинковаться с самым свежим рантаймом? Через специальный дефайн для препроцессора:
_BIND_TO_CURRENT_VCLIBS_VERSION=1
Более подробно, про частные случаи линковки с различными библиотеками рантайма, можно прочитать тут.
ВАЖНО: если вы используете еще какие-то либы типа буста, их тоже придется пересобирать с этой опцией. Иначе будет такая же ситуация с манифестом, как была у меня (несколько рантаймов).