程序的编译、链接流程:
预处理过程:
1.文件包含:预处理器通过
#include
指令将其他文件的内容包含到当前源文件中。这样可以将头文件的定义插入到源代码中,以便在编译时进行函数和变量的声明。2.宏替换:预处理器会对源代码中的宏进行替换。宏是使用
#define
指令定义的符号常量或函数样式的宏。预处理器会将宏的使用处替换为对应的宏定义内容。3.条件编译:预处理器根据条件指令(如
#if
、#ifdef
、#ifndef
等)来判断是否编译某段代码。根据条件的真假,预处理器会选择性地包含或排除特定的代码块。4.注释删除:预处理器会删除源代码中的注释,包括单行注释
//
和多行注释/* ... */
。注释对编译过程没有实际影响,因此在预处理阶段可以将其删除。5.符号替换:预处理器会将源代码中的符号(如常量、变量、函数名等)替换为其对应的值或表达式。这些符号可以是预定义的宏、宏参数或预处理器定义的符号常量。
预处理作用:
可以提高代码的可维护性、重用性、可移植性,可以根据不同的编译条件选择性地包含或排除代码块
可执行文件的组装:
链接器连接的文件有代码段和数据段,不同文件代码段和数据段不同,链接的时候合并同类项,将相同的代码段和数据段合并在一起,组成可执行文件。
文件头部的作用:包含文件信息,比如可执行文件运行在哪个平台上(x86或者ARM)、文件大小多少、文件入口地址是多少。
GNU(GNU's Not Unix)是一个自由软件项目,它的目标是创建一个完全自由的操作系统,即开源思想。
.text:代码段(函数放在代码段)
.rodata:只读数据段(打印的字符串)
.data:数据段(初始化全局变量和静态变量放在数据段)
.bss:(存储未初始化的全局变量和静态变量)
.symtab:(存储符号表信息)