msvcrt-vs2017的编译机制

admin 2025-08-25 阅读:76 评论:0
vs对于C/C++开发者来说,还是比较易用和友好的IDE。虽然我经常开发linux下的服务,也用过vi、kdeveloper、qtcreator等Linux下的IDE环境,但从开发效率而言,最终还是选择在VS下开发调试,再到linux下编译...

vs对于C/C++开发者来说,还是比较易用和友好的IDE。虽然我经常开发linux下的服务,也用过vi、kdeveloper、qtcreator等Linux下的IDE环境,但从开发效率而言,最终还是选择在VS下开发调试,再到linux下编译运行。跨平台部分可以简单地采用boost或者自己写一些简单地封装。

vs的c++实现还算可以,但在posix c部分,差得很远。导致原生linux下的代码,在vs下基本不能直接编译,特别涉及到系统级别的API,缺胳膊少腿得太厉害。为了让支持posix c的qkc更加简洁,减少对vs原生库的依赖,深入研究了vs2017的编译机制。虽然因为工作量太大,影响了qkc进度而暂停,但依然取得不少成果,在这里分享一下。

在vs2017编译一个控制台项目时,会有Debug/Release和win32/x64组合而成的四种选项。从代码复杂度而言,Debug版本的库源码要比Release版本的库源码要复杂,因为要增加不少检查和调试代码。而win32和x64主要是字节长度和平台特性不同,相差不大。所以在这里主要研究win32下Debug版本的编译机制。

一、研究方法

1、网址:https://github.com/QuarkCloud/msvcrt-vs2017.git 这是整理后,可以直接运行测试的版本,代码结构还比较复杂。根目录下vs2017-xxx-xxx编译过程.txt是vs2017编译过程的记录文件。

2、打开项目属性页,进入“配置属性”页。点开 “C/C++” --> “高级”,将“显示包含文件”设置为“是(showIncludes)”;再点开“链接器” --> “常规” ,将“显示进度”设置为“显示所有进度消息(/VERBOSE)”。通过这两个设置,可以在IDE的输出栏中,看到整个编译过程。

3、基础源码分布在ucrt库和vcruntime库下,ucrt的源码目录在$(Windows Kits)\10\Source和$(Windows Kits)\10\Include;vcruntime的源码目录在$(Microsoft Visual Studio)\2017\Community\VC\Tools\MSVC\14.16.27023,不能版本可能有所不同。在整个研究过程中,一个最频繁的操作whatsapp官网,就是在这些目录下,用代码搜索工具搜关键字。

二、编译流程

1、启动引导。可能是为了和早前的版本兼容,vs2017在开始编译时,会首先引用msvctd.lib。在整个编译过程中,msvcrtd.lib扮演着重要角色,它就像是操作系统的引导区一样,和其它库完全不同,其它库的主要功能一般都是输出函数。msvcrtd.lib的细节太多,后续单列一个章节讲述。

2、入口点函数。exe和dll在windows系统中,都是PE格式,都有一个默认的入口函数。exe的入口点是mainCRTStartup,该函数在msvcrtd.lib的exc_main.obj文件中,vcruntime目录下有源码;而dll的入口点是_DllMainCRTStartup,该函数在msvcrtd.lib的dll_dllmain.obj文件,vcruntime目录下也有源码。

3、默认动态库。在早前的VS中,默认是msvcrxxx.dll库,在vs2017中,默认变成ucrtbased.dll和vcruntimexxxd.dll,其中xxx表示版本号。一些系统初始化的函数并不在msvcrtd.lib中,而是分布在这两个库中。

4、生成文件。msvcrtd.lib中的启动文件被拷贝到目标项目中,和项目的其他文件一起编译成二进制文件再打包,同时链接到urcrtbased.dll和vcruntimexxxd.dll。

三、msvcrtd.lib

在前面章节提到过whatsapp登录,vs2017会首先引用msvcrtd.lib,这个行为和vs早期版本一致,可能是为了保持兼容的缘故。和动态库的lib文件不同,msvcrtd.lib名字是动态库规范,但更像是一个静态库,所以看起来比较古怪。

微软一直不厚道的地方,就是没有提供msvcrtd.lib全部的源码,因此自己是无法重新编译出msvcrtd.lib的,缺的文件还不少。不过好在办法总比困难多,用7zip解压msvcrtd.lib,可以拿到所有未提供源码的obj文件,不要问我怎么知道的,直接使用这些obj文件也是一样的效果。这一点非常关键,要定制一个整洁的库,这个切入点必然要用到。

msvcrtd.lib调用的函数分布在ucrtbased.dll和vcruntimexxxd.dll中,而这些函数又关联了更多的其他文件,纯粹的startup代码实际没有那么多,但关联文件太多,导致整个目录依然很庞大。要清理这些文件,工作量可不小。

Debug版本的整理之所以更加困难,就是因为加入太多的跟踪分析代码,比如RTC系列函数,还有内存管理这块的。特别是RTC系列函数,在rtcapi.h中定义,但大都没有提供源码。直接使用obj文件还会链接到更多的文件。

四、难点

1、intrinsic。编译器内联函数是一个巨大无比的坑,在所有地方都找不到目标函数时,先查下以下地址:https://docs.microsoft.com/en-us/cpp/intrinsics/intrinsics-available-on-all-architectures 。因为需要编译器设置/Oi支持,在Debug版本中默认是取消的whatsapp web,而在Release版本默认是打开,这样容易造成混淆。同时,在winnt.h库中定义了一部分Intrinsic函数,而ucrt库也新增一部分intrinsic,这新增部分也容易造成混淆。

2、SEH。结构化异常在startup阶段,占据了大量代码,而且十分繁杂。要去掉的话,不利于调试阶段的代码分析。

3、RTC。和SEH类似作用,但RTC是Debug版本特有的功能,在Release版本中默认是关闭,毕竟频繁的检查影响性能。

4、代码分散。msvcrtd.lib调用的函数分散在ucrtbased.dll和vcruntimexxxd.dll中,而这些函数又会有其他调用链。一个完整的调用链就构成一个复杂的网状结构,导致新的文件不断被拷贝进目标项目。

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

分享:

扫一扫在手机阅读、分享本文

3502文章数 0评论数
热门文章
  • 详细指南:WhatsApp国内使用方法全攻略-下载安装、注册登录及功能使用攻略

    详细指南:WhatsApp国内使用方法全攻略-下载安装、注册登录及功能使用攻略
    一、下载与安装WhatsApp WhatsApp是一款全球使用范围极广的即时通讯软件,不仅可以实现文本聊天,还能进行语音、视频通话WhatsApp中文版,发送文件等功能。由于众所周知的原因,国内用户想要下载和安装WhatsApp可能会遇到一些困难。不过,只要按照以下步骤操作,就能顺利完成WhatsApp的下载和安装。 首先,我们需要解决的是下载问题。由于WhatsApp在国内的应用商店无法直接下载,所以我们需要寻找其他的下载途径。Android用户可以选择到各大安卓市场搜索下...
  • 苹果IOS5.1.1机完美越狱

    苹果IOS5.1.1机完美越狱
    越狱工具下载:(需手动复制: http://bbs./read-htm-tid-4804612.html ) 详细的越狱教程: Absinthe 2.0.4的越狱方法与Absinthe 1.0的越狱方法完全一样,非常简单的“傻瓜一键式”。不过这里绿毒有说明,最好重新刷固件。支持越狱设备IOS5.1.1的固件下载地址请点击本站的IOS固件下载,看下图: 下载完固件之后,把设备连接iTunes,开始刷固件。你也可以选择不刷,但是在越狱的过程之中,新的系统在越狱时会比较的顺利,...
  • 电脑微信的聊天照片文件在哪里微信图片保存电脑哪个文件夹

    电脑微信的聊天照片文件在哪里微信图片保存电脑哪个文件夹
    1. 怎么找到微信聊天图片在哪个文件夹里 图片保存路径:/storage/emulated/tencent/MicroMsg/WeiXin/文件夹,这个是完整路径。而在文件夹中只需要找到/tencent/MicroMsg/WeiXinWhatsApp中文版,就可以了,前面两个文件夹是系统根目录。以下是保存及查找图片的方法步骤介绍。 第一步、找到桌面的微信APP,直接点击打开这个微信的APP。 2. 电脑微信图片保存在哪个文件夹 个人微信文件夹。 电脑版微信聊天的图片,都保存到...
  • Windows 11版WhatsApp将从UWP/Native切换回WebView2打包模式

    Windows 11版WhatsApp将从UWP/Native切换回WebView2打包模式
    Meta(最近更名为 Meta AI)悄然宣布,WhatsApp 将在 Windows 11 上放弃 UWP(WinUI)WhatsApp中文版,退回采用基于 Chromium 的容器。这意味着 WhatsApp 又回到了几年前的样子。由于 web.whatsapp.com 一直领先于 Windows 应用开发,它确实拥有一些新功能,但速度更慢,占用更多内存。 如果独立开发者因为无力维护所有平台的代码库而选择 Web 应用程序,那是一回事,但当像 Meta 这样价值万亿美元...
  • 小米下載WhatsApp的完整指南:安装与使用注意事项

    小米下載WhatsApp的完整指南:安装与使用注意事项
    综上所述,确保您的小米手机具备以上条件,将有助于您顺利下载和安装WhatsApp,享受便捷的通讯服务。在满足这些条件后,您就可以按照后续步骤进行WhatsApp的下载和安装。 2. 下载和安装WhatsApp的具体步骤 在小米手机上下载和安装WhatsApp的具体步骤相对简单,但需注意一些特殊情况。首先,确保你的手机系统已更新到最新版本,以保证最佳的兼容性。由于安卓手机商店内无法直接找到WhatsApp,你可以通过APKPure等第三方应用商店进行下载。打开APKPure应用...