Как я могу определить, для какой версии платформы была создана библиотека?

#visual-studio

#visual-студия

Вопрос:

У меня есть несколько готовых библиотек, и я работаю с проектами на C , используя различные версии VS (2015, 2017, 2019).

Есть ли способ, которым я могу проверить предварительно построенный.файл lib или .dll, чтобы определить, на какой платформе (142,141,140) он был создан?

Ответ №1:

Временная метка и версия компоновщика встроены в заголовок PE и необязательный заголовок соответственно и могут быть извлечены с dumpbin помощью, например:

 C:>dumpbin /nologo /headers %systemRoot%system32cmd.exe

Dump of file C:WINDOWSsystem32cmd.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
            8664 machine (x64)
               7 number of sections
        7E28B365 time date stamp               <-------
               0 file pointer to symbol table
               0 number of symbols
              F0 size of optional header
              22 characteristics
                   Executable
                   Application can handle large (>2GB) addresses

OPTIONAL HEADER VALUES
             20B magic # (PE32 )
           14.20 linker version                <-------
           31000 size of code
           ...
 

Временная метка использовалась для хранения фактической даты и времени, на которых был построен модуль, но в Windows 10 это уже не так по причинам воспроизводимых сборок, как объясняется в книге Раймонда Чена » Почему временные метки модуля в Windows 10 настолько бессмысленны?»?: «установка временной метки в качестве хэша результирующего двоичного файла сохраняет воспроизводимость«.

Однако версия компоновщика по-прежнему надежно заполняется фактической major.minor версией компоновщика, используемого для сборки модуля. Это идентифицирует используемый набор инструментов, например cmd.exe , из Windows 10 версия 2004, похоже, была собрана с VS 2019 v16.0, т.Е. Набор инструментов v142.

Сама по себе версия компоновщика не гарантирует, что весь набор инструментов использовался как есть, поскольку технически возможно смешивать инструменты и библиотеки между разными версиями. Однако это встречается реже, поэтому версия компоновщика дает четкий намек на то, какие версии библиотек использовались.

Сопоставление между версиями компоновщика и версиями VS можно найти, например, здесь:

 MSVC ver    _MSC_VER
14.0        1900 (VS 2015 14.0)
14.1        1910 (VS 2017 15.0)
14.11       1911 (VS 2017 15.3)
...
14.16       1916 (VS 2017 15.9)
14.2        1920 (VS 2019 16.0)
14.21       1921 (VS 2019 16.1)
...
14.28       1928 (VS 2019 16.8)