1,gcc hello.c所包含的过程:
预处理,编译,汇编,链接。
其中预处理主要是对程序代码进行展开,精简。
编译把预处理之后的文件进行一系列的词法分析,语法分析,语义分析,中间代码生成,以及目标代码生成和优化产生汇编代码。
汇编把汇编代码转成机器代码。
链接:将代码的不同部分进行组装,主要包括:地址和空间分配,符号绑定,重定位。
对于编译之后生成的目标文件里面主要包含以下几段:
代码段,(.code):存放机器代码。
数据段,(.data):存放已经初始化的全局变量和局部静态变量。
bss段,(.bss):存放未初始化的全局变量和局部静态变量。
2,程序的执行:
每一个函数在执行main函数之前,会首先执行.init段,执行main函数之后在退出前会执行.fini段,c++代码的构造和析构函数就是依据这一原理,将相应函数置于其中,进行的。
3,静态、动态链接库
静态链接方法:#pragmacomment(lib, "test.lib") ,静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来
静态库的链接可以使用静态链接,动态链接库也可以使用这种方法链接导入库
动态链接方法:LoadLibrary()/GetProcessAddress()和FreeLibrary(),使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态链接的程序。
具体细节可以参看链接:
http://www.cnblogs.com/kex1n/archive/2011/09/06/2168435.html