程序编译过程
程序编译流程预处理主要是处理以“#”号开头的命令,包括宏定义、文件包含、条件编译。
编译的时候会检测语法、函数、变量的声明等情况,有错误则立即报错;经过编译器将c程序编译成汇编程序后,再经过汇编器将会汇编程序编译成.o文件。
链接器就是将.o文件与外部的.a库、.lds链接脚本等文件进行编译生成可执行文件.elf、.out。
可执行文件一般还需要转换工具(objcopy)转换成二进制文件.bin、.hex等
可执行程序对数据的存储包括BSS段、数据段、代码段,这些段在.lds链接脚本里面会定义。
- BSS段:存放未初始化的全局变量和静态变量,默认这些值都为0,可读写;
- 数据段:存放已初始化的全局变量和静态变量,可读写;
- 代码段:存放可执行代码的位置,一般为只读。
堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc/free等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张)/释放的内存从堆中被剔除(堆被缩减)
栈(stack):栈又称堆栈, 存放程序的局部变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。
memory
网友评论