从OS层说起吧。
OS都有加载程序的功能,一个可执行文件(比如exe,com等)内部都是机器指令(cpu相关的)和数据,所以可执行文件和OS以及编译器是密切相关的,不同的OS下不同的编译器产生的可执行文件都不尽相同。不同的平台上其格式大概有elf,pe,coff等。大致都是段的形式来表示。而OS的功能就是读懂这些文件然后完成从磁盘文件到内存的映射工作,也就是适当的时候把文件的内容搬到内存适当的位置;
OS加载的过程就是进程创建的过程,进程创建完毕后,会找到“入口函数”去执行;
进入入口函数后就等于进入了运行库,因为入口函数就是运行库的一部分;
入口函数开始初始化运行程序和程序的运行环境,比如堆的初始化,I/O初始化,线程的准备,全局变量等的初始化;
下一步就进入程序的主体,也就是调用main函数部分。
main函数执行结束后又回到入口函数,此时入口函数要进行一些清理工作。
清理完成后执行一个系统调用来kill掉进程。
OK,一个可执行文件的整个执行周期就结束了。
对于c语言,运行库叫crt(c runtime),linux下的crt为glibc,它的程序入口函数为_start,是由汇编语言实现的,包含在crt1.o这个目标库文件里。在windows下crt为msvc crt,它的入口函数是mainCRTStartup。对于每个程序,链接过程都会给你的可执行程序加进一些运行库目标文件,这样才保证你的程序是一个独立的可执行体。正式这些“额外”的代码把你的main函数调用起来的。
一般在链接程序的时候须指定入口函数名。