1) 预处理:主要对源码预编译语句(如宏定义define)和文件包含进行处理。即对宏指令替换和包含文件放置到需要编译的文件中,完成后会生成完整的C程序源文件。

2) 编译:对预处理以后文件进行编译,生成.s后缀的汇编语言文件,即该文件里是汇编语言的代码,汇编是一种更底层的语言,直接对硬盘进行操作。

3) 汇编:对汇编语言文件进行汇编,主要调用汇编处理程序来完成汇编,汇编是生成二进制机器代码的过程,汇编后的文件以.o结尾,称为目标文件。

4) 链接:将多个由汇编生成的目标文件以及引用的库文件进行模块链接,生成一个完整的可执行文件,链接时,所有目标文件被安排在可执行程序的适当位置,同时程序调用的库函数也从各自所在的函数库链接到程序中。

 

下面演示C语言代码 如何转变成 可执行的二进制文件:

假如现在有段C语言源代码如下

android 二进制生成图片 生成二进制文件_目标文件

 

对其进行预处理,处理后的文件如下图所示

gcc -E -o a.cxx a.c

android 二进制生成图片 生成二进制文件_目标文件_02

 

 生成汇编代码

gcc -S -o a.s a.c

 

android 二进制生成图片 生成二进制文件_目标文件_03

 

生成目标文件

gcc -c -o a.o a.c

android 二进制生成图片 生成二进制文件_目标文件_04

 

链接生成可执行文件

gcc a.c -o a.out

android 二进制生成图片 生成二进制文件_android 二进制生成图片_05

 

最后一个可执行文件就生成了

android 二进制生成图片 生成二进制文件_汇编语言_06

 

下面是gdb调试程序基本使用

android 二进制生成图片 生成二进制文件_目标文件_07

 

 

写一个简单的c语言程序测试下

 

android 二进制生成图片 生成二进制文件_目标文件_08

 

生成debug文件

gcc -g -o a.debug hello.c

android 二进制生成图片 生成二进制文件_汇编语言_09

 

运行gdb,然后载入调试文件a.debug,list 查看源代码

android 二进制生成图片 生成二进制文件_汇编语言_10

 

break 设置断点,即运行到第几行,让程序暂停一下

android 二进制生成图片 生成二进制文件_预处理_11

 

info breakpoint 查看断点,删除断点用delete + Num

android 二进制生成图片 生成二进制文件_目标文件_12

 

run 运行程序,如下图程序会在断点处暂停

 

android 二进制生成图片 生成二进制文件_汇编语言_13

 

输入next 让程序继续运行一行,输入continue 让程序运行到下一个断点为止

android 二进制生成图片 生成二进制文件_汇编语言_14

 

在断点处可以打印或者操作变量,对排除bug非常有用,退出则按q键即可

android 二进制生成图片 生成二进制文件_预处理_15

其他高级的用法可以去查阅相关资料,这里就不一一细说了。

 

程序员最高境界:静若瘫痪,动若癫痫