Почему 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 не предоставляет связываемые символы для этих экспортов, поэтому их невозможно случайно использовать.)

Другие вопросы по тегам