C编译过程 以及 ELF文件(学习笔记)

本文详细介绍了C语言程序从源代码到可执行文件的编译过程,包括预处理、编译、汇编和链接四个阶段,以及在Unix系统中gcc的使用。同时,文章深入探讨了ELF文件的结构,包括可重定位文件、可执行文件、共享目标文件和核心转储文件,并解释了Section和Segment的区别。此外,还提到了静态库和动态库的概念。

C编译过程

一个用C语言编写的高级语言程序是从编写到打包、再到编译执行的基本过程,我们知道在CPU上执行的是低级别的机器语言,从高级语言到低级别的机器语言肯定是要经过翻译过程,这个过程大体的过程如下图所示:

img

在Unix系统中,从源文件到可执行目标文件是由编译驱动程序完成的,如大名鼎鼎的 gcc,翻译过程包括图中的是个阶段;

  1. 预处理阶段

    1. 预处理器(cpp)根据以字符#开头的命令修给原始的C程序,结果得到另一个C程序,通常以.i作为文件扩展名。主要是进行 文本替换、宏展开、删除注释 这类简单工作。
    2. 对应的命令:linux> gcc -E hello.c hello.i
  2. 编译阶段

    1. 编译器将文本文件 hello.i 翻译成 hello.s ,包含相应的汇编语言程序
    2. 对应的命令:linux> gcc -S hello.c hello.s
  3. 汇编阶段

    1. 将.s文件翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件.o中(把汇编语言翻译成机器语言的过程)。

    2. 把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行 词法分析 和 语法分析 ,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。

      • 词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即 对构成源程序的字符流进行扫描然后根据构词规则识别单词 (也称单词符号或符号)。词法分析程序实现这个任务。词法分析程序可以使用lex等工具自动生成。

      • 语法分析是编译过程的一个逻辑阶段。语法分析的任务是 在词法分析的基础上将单词序列组合成各类语法短语 ,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.

      • 语义分析是编译过程的一个逻辑阶段. 语义分析的任务是 对结构上正确的源程序进行上下文有关性质的审查 , 进行类型审查.例如一个C程序片断:

        int arr[2], b;

        b = arr * 10;

        源程序的结构是正确的.

        语义分析将审查类型并报告错误:不能在表达式中使用一个数组变量,赋值语句的右端和左端的类型不匹配.

      • 在进行了语法分析和语义分析阶段的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间表示或中间代码。所谓“中间代码”是一种结构简单、含义明确的记号系统,这种记号系统复杂性介于源程序语言和机器语言之间,容易将它翻译成目标代码。另外,还可以在中间代码一级进行与机器无关的优化。

      • 想详细了解编译过程,请看:编译原理(douban.com)

    3. 对应的命令:linux> gcc -c hello.c hello.o

  4. 链接阶段

    1. 此时hello程序调用了printf函数。 printf函数存在于一个名为printf.o的单独的预编译目标文件中。 链接器(ld)就负责处理把
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入一下?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值