元始天尊 发表于 2014-11-11 01:43:23

关于MSVC的几个问题的研究

关于MSVC的几个问题的研究
1.文件->新建菜单的列表项所属文件
界面如图所示:

2年前曾经有朋友的文件中的C++ Source File这一条丢失了,不知什么缘故,当时我给他的解决方法是重新把VC6目录的文件拷贝一下,一般VC6安装光盘目录下已经带了相关重要文件,安装过程只不过是复制而已。但是究竟是什么原因呢?经过仔细研究,我发现这是VC6目录的一些配置文件丢失的缘故。为了进行研究,需要用到Procmon来监视VC6目录的文件访问情况,在Procmon过滤器中设置好访问目录,如下图:

此时打开文件->打开选项卡,打开新建对话框,由于没有建立工程,此时默认显示“工程”这一栏,Procmon中出现了几个.AWX文件的访问情况:

这种文件是VC6的向导文件每个文件与工程下面列表中的一项对应,例如上图MFCTLWZ.AWX对应的是MFC ActiveX Control Wizard,有些dll文件也是向导文件,所谓向导就是选择了工程以后会一步步提示根据用户选择自动设置该工程属性,这种向导文件的编写方法在某些VC编程书籍中可以找到,这里不讨论。切换到“文件”选项卡时会发现出现了.PKG文件记录,这种文件为VC6的配置文件(同样有的dll文件也是配置文件),同样的每一个文件对应文件类型列表中的一项,用exescope可以得知C++ Source File这一项对应DEVCPP.PKG。如果该文件损坏,自然就无法显示。

2.一直不知道MSVC6究竟如何编译的,而使用Procmon可以监视出来,使用默认配置,并去除掉所有链接库,得到如下调用流程(这些文件的逆向分析将会出现在我的书中):
msdev.exe -> vcspawn.exe       
vcspawn.exe -> cl.exe
cl.exe -> mspdb60.dll                class info???
cl.exe -> c1xx.dll(后缀.cpp)                (后缀.c)c1.dll
cl.exe -> c2.dll
vcspawn.exe -> link.exe
link.exe -> mspdb60.dll
①采用静态链接库编译时【1】:
link.exe -> libc.lib libcd.lib libci.lib libcid.lib libcimt.lib libcmt.lib libcmtd.lib libcp.lib libcpd.lib libcpmt.lib libcpmtd.lib中的一个或多个【2】
link.exe -> oldnames.lib
link.exe -> kernel32.lib
②采用动态链接库编译时:
link.exe -> msvcrt.lib

【1】工程设置->常规中选择“使用MFC作为静态链接库”,则链接静态形式lib,这里说MFC是一种错误,其实是包括C/C++运行库的。

【2】见http://blog.csdn.net/xjh_love_paopao/article/details/3587825

【3】和【1】同理

我也分析了gcc的windows版本Dev C++,大体过程相似,结果如下:
devcpp.exe -> make.exe
make.exe -> cmd.exe
cmd.exe -> g++.exe
g++.exe -> crt2.o
g++.exe -> crtbegin.o
g++.exe -> crtend.o
g++.exe -> ld.exe
ld.exe -> libstdc++.a
ld.exe -> libmingw32.a
ld.exe -> libgcc.a
ld.exe -> libmoldname.a
ld.exe -> libmingwex.a
ld.exe -> libmsvcrt.a
ld.exe -> libuser32.a
ld.exe -> libkernel32.a
ld.exe -> libadvapi32.a
ld.exe -> libshell32.a


这里简要说下lib文件,这种文件分为2种,一种是通过建立动态链接库工程生成的,实际执行代码存在dll中,lib只有索引作用,便于静态链接,所以体积较小,链接到的可执行文件需要dll支持;而另一种是通过建立静态链接库工程生成的,实际执行代码在lib中,所以较大,链接到的可执行文件不需要dll支持。二者结构差异也很大,一个为obj结合,而另一个为dll集合。通过选择【1】图中的选项可以将整个工程调整为使用静态或动态链接方式编译。

3.用vs写一个简单的helloworld,单步调试到main结束,会发现自己身处crtexe.c中的mainCRTStartup,该函数为程序真正入口。进入vs目录中查找发现有很多这样的文件:
Crt0.c用于静态链接的真正函数入口和相关库函数
Crtexe.c 用于动态链接库的真正函数入口和相关库函数crtexew.c为宽字符版
Crtdll.c用于dll真正入口和相关库函数
Crtlib.c 用于lib的相关库函数

未来一个月内本人会对这些入口做深入分析,敬请期待!

4.既然编译器总是给我们强制入口,自然生成C/C++运行库,那么我们能不能让编译器不这么做呢,有的!如果你设置了工程入口点,就不会有自动生成的这些了。如下图:

CCInt3 发表于 2014-11-19 17:16:02

向楼主学习

0xAA55 发表于 2014-11-20 14:59:58

已经被我重新排版。
页: [1]
查看完整版本: 关于MSVC的几个问题的研究