入口函数和程序初始化
入口函数/入口点
程序的入口点实际上是一个程序的初始化和结束部分,它往往是运行库的一部分。
一个典型的程序运行步骤大概如下:
- 操作系统在创建进程之后,把控制权交给程序的入口,这个入口往往是运行库中某个入口函数
- 入口函数堆运行库和程序运行环境进行初始化,包括堆、I/O、线程、全局变量构造等等
- 入口函数在完成初始化之后,调用main函数,正式开始执行程序主体部分
GLIBC入口函数
glibc的程序入口为_start,它由汇编实现,并且和平台相关。
它里面有:
init
unint
rtld_fini //这里是和动态加载有关的收尾工作
MSVC CRT 入口函数
默认入口函数名为:mainCRTStartup。它的大概流程是:
- 初始化和OS版本有关的全局变量
- 初始化堆==》这里会调用HeapCrete创建默认堆
- 初始化I/O
- 获取命令行参数和环境变量
- 初始化C库的一些程序
- 调用main并记录返回值
- 检查错误并将main的返回值返回
I/O
- 输入和输出
- 对于操作系统来说,它代表了计算机与外界的交互
- 对于程序来说,它代表了程序与外界的交互,包括文件、管道、网络、命令行、信号等。
C/C++运行库
一个C语言运行库大致包括:
- 启动与退出 ==》 包括入口函数及入口函数所依赖的其他函数
- 标准函数 ==》 由C语言标准规定的C语言标准库所拥有的函数实现
- I/O ==》 I/O功能的封装和实现
- 堆 ==》 堆的封装和实现
- 语言实现 ==》 语言中的一些特殊功能的实现
- 调试 ==》 实现调试功能的代码
C语言标准库 :
- 标准输入输出 stdio.h
- 文件操作 stdio.h
- 字符操作 ctype.h
- 字符串操作 string.h
- 数学函数 math.h
- 资源管理 stdlib.h
- 格式转换 stdlib.h
- 时间/日期 time.h
- 断言 assert.h
- 各种类型上的常数 limits.h float.h
- 变长参数 stdarg.h
- 非局部跳转 setjmp.h