本文最后更新于388 天前,其中的信息可能已经过时,如有错误请发送邮件到939925357@qq.com
1.gcc编译过程
写了这么久的代码,但是还是对c语言源代码到可执行文件其中的过程一无所知,让我这个计算机专业的学生自愧不如,趁着学CSAPP课,我来补齐我在这方面的空缺。
ps:以下代码均在Linux的 5.4.0-156-generic #173-Ubuntu服务器下运行。
首先gcc的编译流程分为四个步骤:(假设我们当前已经有一个main.c的c语言源代码)
1、预处理(Pre-Processing)
gcc -E main.c -o main.i //得到补充完整的库以及调用的函数定义 比如调用了printf 则返回的文件中回包含stdio.h所有内容
2、编译(Compiling)
gcc -S main.i -o main.s//生成相关汇编代码
3、汇编 (Assembliang)
gcc -c main.s -o main.o//生成对应的机器码(二进制)
4、链接(Linking)
gcc main.o -o main//将机器码与系统中的指令码连接生成可执行文档
总结上述过程即为:main.c->main.i(补全版源代码)->main.s(汇编代码)->main.o(机器码)->main.exe(可执行文件:即cpu能直接读懂的指令集)
2.gdb调试
gdb调试,可以在程序正常运行的过程任何一个机器代码层面上停止,可以让你在代码指向过程中实现类似时停的效果方便你去弄清程序在汇编代码层面上究竟发生了什么,比如你可以用来debug,比如搞清楚究竟是哪里内存溢出了,或者实现经典CSAPP中的作业:“拆炸弹”。
1、预处理
如果当前你有一个test.c文件, 你想gdb调试它,那么你必须需要预处理参数一下它。
gcc -g test.c -o test
之后 使用gdb test开始调试了,或先gdb进入gdb模式,再file test也可以达到相同效果。
2.查看调试程序的源代码
list line1,line2 //显示line1行到line2行的所有代码 list lineNum //显示在lineNum前后的5行的源代码 list + //列出当前行后10行源代码 list - //列出当行前10行源代码 list function //从函数头开始显示源代码 set listsize count // 设置显示代码的行数 show listsize //显示打印代码的行数,默认为10