程序员的自我修养 学习笔记(5)
运行库
程序的入口点,实际上是一个程序的初始化和结束部分,往往是运行库的一部分。典型的程序运行步骤大致如下:
1. 操作系统在创建进程后,把控制权交给了程序入口,此入口通常为运行库中的某个入口函数
2. 入口函数堆运行库和程序运行环境进行初始化,包括堆栈、I/O、线程、全局变量构造等等
3. 完成初始化后,调用main函数,正式开始执行程序的主体部分。
4. main函数执行完毕后,返回到入口函数,入口函数进行后续的清理工作,包括全局变量析构、堆销毁、关闭I/O,然后进行系统调用结束进程。
glibc程序的入口地址为_start,这个入口有ld连接器默认的链接脚本所指定。
C语言标准库,ANSI C的标准库由24个C头文件组成,仅仅包含了数学函数、字符/字符串处理、I/O等基本方面。例如
标志输入输出 文件操作 stdio.h
字符操作 ctype.h
字符串操作 string.h
数学函数 math.h
资源管理/格式转化 stdlib.h
时间/日期 time.h
断言 assert.h
各种类型上的常数 limits.h float.h
glibc库:glibc库,即GNU C Library,是GNU旗下的C标准库,最初由自由软件基金会发起开发,目的是为GNU操作系统开发一个C标准库。glibc的发布版本主要由两部分组成,一部分是头文件,比如stdio.h,stdlib.h等等,往往位于/usr/include、另一部分,则是库的二进制文件部分,就是C语言的标准库,它有静态和动态两个版本。动态库为/lib/libc.so.6(即为第六个libc版本),静态库为/usr/lib/libc.a
glibc的启动文件,有.init 和 .finit段,这两个段中的代码,最终会被拼成两个函数_init()和_finit(),这两个函数会先于/后于/main函数执行。
Windows系统是完全基于DLL机制的,它通过DLL对系统调用进行了包装,进行了所谓了Windows API。