C源文件需要经过预处理、编译、汇编、链接,生成可执行文件
gcc:
gcc 命令:用来编译C和C++文件-c 编译、汇编而不链接
-S 编译而不进行汇编和链接
-E 预处理
-v 同时显示编译器的代码
-o<文件> 将输出输入到指定文件
-x<语言> 指定语言
--help 显示帮助信息
--version 显示版本信息
gcc –E hello.c –o hello.i //预处理,生成hello.i
预处理是将引用的头文件的代码加入到C语言代码中,并用实际值替换define定义的字符串,为的是能将hello更好地翻译成汇编语言。程序的预处理过程是将头文件的内容添加到程序里,所以会由原来的十几行变为三千多行。
gcc –S hello.i –o hello.s //编译,生成hello.s
编译是由编译器将hello.i预处理文件翻译成hello.s编写文件的过程。其中,hello.s记录了c程序对应的汇编代码,从而便于机器识别,为下一步转换为机器代码做好条件。
gcc –c hello.s –o hello.o //汇编,生成可重定位目标代码
汇编器(as)将.s汇编语言翻译成为机器语言,在这个过程中,也可以将C程序中应用的库函数一起汇编,最终形成机器可识别的并运行hello.o可执行文件
gcc hello.o –o hello //链接,生成可执行目标代码
概念:链接是将各种代码和数据片段收集并组合称为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。
作用:主要的任务是符号解析和重定位。链接得到的可执行文件可以被加载到内存中运行。
./hello //执行hello目标文件
objdump -d hello.o > hello.o.asm //反汇编可重定位目标文件hello.o
objdump -d hello > hello.asm //反汇编可执行文件hello
分析:Hello的一生所经历的过程:第一步,预处理,将hello.c所有的头文件的相关代码合并成一个hello.i文件。第二步,编译,将hello.i或hello.c文件编译成汇编文件hello.s, c语言变成汇编语言.。第三步,汇编,将hello.s翻译成可重定位目标文件hello.o, 汇编语言加上机器代码。第四步,链接,将hello.o与库函数连接成可执行目标程序hello。第五步,Shell运行,在Shell中输入运行指令./hello运行出x+y=3。
操作步骤:
gcc –E hello.c –o hello.i //预处理,生成hello.i
gcc -m32 –S hello.i –o hello.s //编译,生成hello.s,32位汇编代码
gcc -m32 –c hello.s –o hello.o //汇编,生成32位可重定位目标代码
gcc -m32 hello.o –o hello //链接,生成32位可执行目标代码
./hello //执行hello目标文件
objdump -d hello.o > hello.o.asm //反汇编可重定位目标文件hello.o
objdump -d hello > hello.asm //反汇编可执行文件hello
gdb(调试):
gcc -g ./a.out // -g 进行调试 a.out 自动生成的可执行文件
run 或者 r 运行程序
quit 退出gdb模式
list 查看我们的源代码
b 或者 break 打断点:
函数的地方 函数名字
在第几行打断点
info b 查看断点的情况
print 打印变量:
arr[0]
&arr[0]
step s 进去某一个具体的函数调试
shell 去掉我们终端的命令
日志功能
set logging on
watchpoint
观察变量是否变化
info 来查看我们的watchpoint