在windows上安装或执行程序,都有机会遇到词汇——runtime。
在windows上安装或执行程序,都有机会遇到词汇——runtime。
runtime究竟是什么,首先runtime在英文里是合成单词,无论是英文还是中文都容易在文字层面被误解,中文直译“运行时”,中文的断句容易引起歧义,究竟是“运行、时”还是“运行时”傻傻分不清。
为了准确描述runtime的实际意思,我认为runtime换成execution environment理解起来更容易:即位应用程序的执行准备运行环境。
运行时库是在编译时使用的特殊库,用于在计算机程序的执行中实现内置于编程语言中的功能,包括:输入、输出、内存管理。
比如C语言需要的最小runtime叫做crt0(C runtime)。“crt”代表 “c runtime”,“0”代表“最基本、最开始”。
crt0应该包含如下7个步骤。
这个crt0的结构看起来是不是很熟悉?没错,在u-boot源码启动代码看到类似结构。
crt0.S编译生成crt0.o,今后gcc编译的所有应用程序前都加上这段内容,既然有crt0,那么再发挥想象力,是不是还会有crt1什么的呢,全盘搜索看到若干crt前缀的*.o文件,这些crt*.o文件合并起来被称做 'runtime library'
运行时库(runtime library)与标准库(standard library)不是一个东西。
标准库和运行库之间有一个非常重要的区别。尽管标准库定义了程序员可以使用的功能,但不是编程语言的规范的一部分,至少在C语言中不是,运行时库却时程序运行所必需的部分。
举个例子,printf()是C标准库的一部分,程序的启动是在运行时库实现的,启动过程对程序员不可见,因此,你编写的程序可以不使用标准库,但始终需要运行时库,否则无法运行。老实说,在操作系统上编写不使用标准库的应用程序几乎无实际意义,那样的程序没有访问外设的方法、屏幕上不会输出令人印象深刻的结果。在裸机上情况就不一样了,访问外设不需要系统调用,没有系统的权限隔离,外设的寄存器也有读写权限。
简单编写一个只有main
编译后看看符号表:
很多不知哪来的函数符号都来源与crt*.o,如register_tm_clones源于crtbegin.o;__data_start、__libc_start_main源于crt1.o