根据 Dependency Walker,为什么它们导出ucrtbase.dll
的某些功能会重叠?vcruntime140.dll
免责声明:目前这对我来说纯粹是学术兴趣。
我目前正在尝试了解 Microsoft Visual-C++ CRT 相关 DLL 文件的布局。在此处查找 UCRT 的信息和一般文件:
简而言之,对于普通的 C++ 应用程序,您在运行时拥有这些(顶级)DLL 依赖项:
ucrtbase.dll
- “编译器独立”的东西vcruntime<ver>.dll
- “编译器依赖”的东西msvcp<ver>.dll
- C++ 标准库
可以从该信息中突出显示的是:
从博客条目:
...将 CRT 分成两个逻辑部分: VCRuntime,其中包含进程启动和异常处理等所需的编译器支持功能...
并从 MSDN 页面:
vcruntime 库包含 Visual C++ CRT 实现特定的代码,例如异常处理和调试支持、运行时检查和类型信息、实现细节和某些扩展库函数。该库特定于所使用的编译器版本。
在使用Dependency Walker浏览 DLL 时,我注意到ucrt和 vcruntime 都导出了该函数_CxxThrowException
。如果您曾经查看过 vc++ 堆栈跟踪,那么这个函数是老熟人了:
构建异常记录并调用运行环境开始处理异常。
我很惊讶地发现它是从ucrtbase.dll
as 中导出的——正如上面的两个引号所表明的那样——我认为这种机器完全属于编译器特定的一面。
memcpy
在写这篇文章时,我注意到了其他一些重叠:strstr
虽然vcruntime140.dll
我预计它们只存在于ucrtbase
.
那么这里发生了什么,我可以从中学到什么?