嵌入式C语言开发学习笔记 ——从源代码到可执行文件

读书,是为了思考和权衡。
gcc -E  file.c -o file.i   // 预处理
gcc -s file.i -o file.s    // 生成汇编代码
gcc -c file.c -o file.o    // 编译生成的则是一个可重定位的目标文件
gcc file.c -o  file        // 生成elf文件
1. 可执行文件的建立过程

(1)源码 ——> 预编译 ——>编译 ——> 汇编 ——>链接 ——>可执行文件。
 

2. 预编译

(1)处理以“#”开始的预编译指令。

  • 替换:#include #define
  • 条件编译:“#if”、“#endif”、“#ifdef”、“#elif”和“#else。
  • 保留:#program

(2)删除注释

(3)添加行号和文件标识。

(4)xxx.i
 

3. 编译

(1)词法分析

(2)语法分析

(3)语义分析

(4)优化

  • 中间代码优化(无用变量删除、除用移位替换等)
  • 针对不同硬件特点的优化。

(5)由代码生成器将优化后的中间代码生成汇编代码文件。

(6)xxx.s
 

4. 汇编

(1)将汇编语言代码翻译成机器语言,得到目标文件。

(2)目标文件由段组成,至少包含两段:代码段和数据段。

  • 代码段:程序的指令。可读可执行,不可写。
  • 数据段:程序中的全局变量、静态数据。

(3)xxx.o
 

5. 链接

(1)符号收集

(2)符号解析:将每个符号的引用和一个符号定义连接起来。

  • 强符号:函数和已初始化的全局变量为强符号。
  • 弱符号:未初始化的全局变量为弱符号。
  • 符号解析原则:多个强符号,报错;一强多弱选强;多弱随机选(也有说选内存占用最大的那个)。

(3)符号定位

你可能感兴趣的:(编程,C)