链接、装载与库:运行库

简介


       本篇简单介绍下运行库,并总结下一个程序的最终运行环境。


入口函数


       操作系统装载程序之后,并不是马上从main()函数开始。程序运行的第一行代码是从ELF可执行文件头中的入口地址开始的。从入口地址开始的代码,会负责准备好main函数执行所需要的环境,并且负责调用main函数。之后,你才可以放心的在main函数中申请内存、使用系统调用,访问I/O等等操作。在调用main函数返回后,再由后续的代码做清理,结束进程。

       从入口地址开始执行以上功能的代码的函数,我们就称其为入口函数,它属于运行库的一部分。


       据此,一个典型的程序运行步骤整理后主要有以下:

       1) 操作系统在进行完链接和装载后,控制权交给程序的入口函数,这个入口实际上是一个程序的初始化和结束部分;

       2) 入口函数对运行库和程序运行环境进行初始化,包括堆、I/O、线程、全局变量构造,等等;

       (入口函数最重要的部分,堆初始化和I/O初始化。在main函数中使用malloc申请内存,printf打印,使用系统调用、触发异常、访问I/O,都是在这一步做好了准备工作)

       3) 入口函数完成初始化之后,调用main函数,正式开始执行主体部分;

       4) main函数执行完毕,返回入口函数。入口函数进行清理工作,包括全局变量析构、堆销毁、关闭I/O等,然后进行系统调用结束进程。


运行库


       任何一个程序,它的背后都有一个庞大的代码集合,以使得程序正常运行。这个集合至少包括入口函数,及其所依赖的函数所构成的函数集合,还包括各种标准库函数的实现。这样一个代码集合我们成为运行时库(Runtime Library)。

       对于C语言的运行库,就叫做C运行库。Linux下C库是Glibc(GNU C Library),Windows下就是MSVC(Microsoft Visual C Run-time)。其中,MSVC还提供C++语言的标准库。


       C库的主要功能:

       1) 启动与退出:包括入口函数及入口函数所依赖的其他函数等;

       2) 标准函数:由C语言标准规定的C标准库所拥有的函数实现;

       3) I/O: I/O功能的封装和实现,主要就是文件的I/O操作,如fopen、fread等;

       4) 堆:堆的封装和实现,诸如malloc,free等;

       5) 语言、调试代码等。

       其中,在这些运行库的组成成分中,C标准库占据了主要地位。


       我们一般很少涉及运行库的开发,因此,只要清楚运行库的概念,知道其在程序运行过程中起的作用,这个目前对我来说就足够了。所以,细节的部分就不整理了。

       后续,自己手动实现下书中的MiniCRT,完成后再提交到GitHub,完成后再更新。

程序运行环境

        

       至此,链接、装载与库的几大主要部分的内容基本梳理完毕。对于一个程序的产生、运行和结束的整个过程,也可以说已经有一个十分清晰连贯的理解和感受。

       再用图示例下:

       链接、装载与库:运行库_第1张图片


       这个图基本涵盖了一个程序的过程以及运行的环境。所以,最后就用这个图结束这系列的整理咯。




你可能感兴趣的:(链接,装载与库)