Почему ucrtbase экспортирует _CxxThrowException?
Почему ucrtbase.dll
а также vcruntime140.dll
перекрываются ли некоторые функции, которые они экспортируют в соответствии с Dependency Walker?
Отказ от ответственности: в настоящее время это чисто академический интерес для меня.
В настоящее время я пытаюсь понять расположение файлов DLL, связанных с Microsoft Visual-C++ CRT. Найти информацию о UCRT и файлы в целом здесь:
Короче говоря, у вас есть эти (toplevel) зависимости DLL во время выполнения для нормального приложения C++:
ucrtbase.dll
- "независимый от компилятора" материалvcruntime<ver>.dll
- "зависимый от компилятора" материалmsvcp<ver>.dll
- стандартная библиотека C++
Что можно выделить из этой информации:
Из записи блога:
... разделить CRT на две логические части: VCRuntime, который содержал функциональные возможности поддержки компилятора, необходимые для таких вещей, как запуск процесса и обработка исключений...
и со страницы MSDN:
Библиотека vcruntime содержит код, специфичный для реализации Visual C++ CRT, такой как поддержка обработки исключений и отладки, проверки времени выполнения и информация о типе, подробности реализации и некоторые расширенные функции библиотеки. Эта библиотека зависит от версии используемого компилятора.
Просматривая библиотеки DLL с помощью Dependency Walker, я заметил, что и ucrt, и vcruntime экспортируют функцию _CxxThrowException
, Эта функция - старый знакомый, если вы когда-либо просматривали трассировки стека vC++:
Создает запись об исключении и вызывает среду выполнения, чтобы начать обработку исключения.
Я очень удивлен, обнаружив, что это экспортируется из ucrtbase.dll
поскольку - как указывают обе приведенные выше цитаты - я бы подумал, что этот механизм твердо принадлежит специфической стороне компилятора.
При написании этого я заметил некоторые другие совпадения: очень мало стандартных функций библиотеки C (memcpy
,..., strstr
,...) также экспортируются из vcruntime140.dll
хотя я бы ожидал, что они будут жить только в ucrtbase
,
Итак, что здесь происходит и что я могу извлечь из этого?
1 ответ
Универсальный CRT (ucrtbase.dll) содержит личную копию VCRuntime для использования компонентами операционной системы Windows. Эта частная копия VCRuntime является внутренней деталью реализации операционной системы и может изменяться в любое время (т. Е. Нет никакой гарантии совместимости приложений.
Ни при каких обстоятельствах не используйте этот экспорт из универсального ЭЛТ. (Ни одна библиотека в Windows SDK не предоставляет связываемые символы для этих экспортов, поэтому их невозможно случайно использовать.)