在本博客开启时,就有打算写这块的冲动,直到现在,直到今晚,突然一股劲让我开了这个系列,写下开篇。 近段时间一直忙于工作,潜下心来做自己的研究也少了很多,每天下班回家都10点多了,很累。一般就洗洗睡觉了,远远比不得几年前的精力和状态了。看来我得好好调整一下时间,让时间用在刀刃上。 切入正题,本系列主要针对vc的crt库中的intel版本asm源码进行逐个剖析,前面已经有大概两篇文章已经涉及到了这个系列的研究范围。一篇是《深入C/C++之基于Cookie的安全检查(VS2005)》,这篇里面提到了secchk.c这个用于安全检查的源文件。另一篇是《【动态分配栈内存】之alloca内幕》,里面剖析了alloca16.asm和chkstk.asm这两个源文件。因此,为了进一步将这类crt源码进行剖析,特地开设本系列博文,同时给自己一个对以往的研究进行总结的机会。 本系列同样在vs2008(vc9)环境下进行,我对比了一下各个版本vc下的crt,对于这个intel模块下的源码差异很小。在之后有碰到差异时,再进行详细区分。这个intel模块的目录在vc安装目录下的:VC\crt\src\intel目录里。这个目录里有很多asm源码,通过文件名,我想大家都能知道一些常见的函数。当然有一些相对陌生的函数,我们在之后再一步一步研究。另外,可以发现这个目录下有4个xxx_lib的目录,它们分别是:dll_lib、mt_lib、xdll_lib和xmt_lib。这几个文件夹下面有很多.obj和一些lib文件,想必它们是不同版本的crt中间文件和lib。的确如此,相对于VC的工程属性下“C/C++->常规->代码生成->运行库”的设置,dll_lib对应于多线程DLL (/MD),mt_lib对应于多线程(/MT),xdll_lib对应于多线程调试DLL (/MDd),xmt_lib对应于多线程调试(/MTd),不同的运行库选择,会链接不同的lib。这里的4个文件夹里面的obj分别被编译到msvcrt.lib、libcmt.lib、msvcrtd.lib和libcmtd.lib中(当然还有其他的lib,这里不再累述)。这几个lib位于VC安装目录下的VC\lib目录里。通过我们的编译器设置而链接相应的静态库。如果你想试验一下,你可以在选择前面提到的4种运行库之后,在链接器的输入选项卡下,在忽略特定库选项里添上对应的lib库名(如:选择了/MD运行库时,忽略msvcrt.lib),你会发现链接会失败。 在工作这么些年的以来,发现很多拥有几年甚至十多年经验的cc++程序员,对于crt库的相关设置都会有一丝惧怕,例如在设置了某些运行时库后,在链接时碰到一些重定义,乃至一大篇的LNK2001错误时,就不知所措了。更有甚者,就害怕各种lib之间的链接,害怕dll之间的依赖。我个人认为,VC给出的信息已经很多很清晰了,关键在于平时我们是否用心去观察,用心去挖掘其中的原委。当你清楚了其中的关系时,当你知晓了crt的相关常见函数时,这些链接错误,重定义错误就显得很明了了。有种运筹帷幄之中的感觉。不管是crt还是自己写的动态库静态库,都是大同小异的。 对于上面提到的种种现象,我想,这也算是我写这个系列的一个动力吧。很多时候,我们相信crt,相信其优秀,相信其性能。那么相信的同时,作为一个追根究底,乐于思考的程序员来说,我想,肯定会有去研究深入的冲动。我也算是这么一个人吧。当然,你如果看到这里,发现这样做没什么必要,或者觉得这是在浪费时间,那我只能认为是每个人的追求不一样吧,当然这里的追求没有高低好坏对错之分,只是路不同罢了。人活在这个世界上,恐怕连自己都很难说清楚自己到底是要追求什么,可能是长久的,可能是短暂的,这一切都在于当前的认知是否适合做什么。扯远了,回到正题,只想说明一点,本系列的所有文章仅代表我个人观点。 最后,归纳一下本系列的相关环境和说明: 环境:Microsoft Visual Studio 2008 OS:Microsoft Windows 7 申明:本系列只立足于VS2008及windows平台,无特殊说明,不涉及跨平台。因此,对于crt的相关研究,例如性能、优化等在无特殊说明时,都只针对于windows平台,microsoft编译器。 有激情肯追求的朋友,一起研究吧。对于大牛们,我只想说:“亲,你完全可以略过,如果能提个意见留个脚印,我甚是感谢!” :) ****************如需转载,请注明出处:http://blog.csdn.net/masefee,谢谢********************** |