基本格式:gcc [options] file1 file2... //若不加入参数,则按默认参数依次执行编译、汇编和链接操作,生成的可执行文件名为 a.out
常用参数:-E //只执行预处理操作-S //只执行到编译操作完成,不进行汇编操作,生成的是汇编文件(.s 或 .asm),内容为汇编语言-c //执行编译和汇编,但不进行链接,即只生成可重定位目标文件(.o),为二进制文件,不生成完整的可执行文件-o filename //将操作后的内容输出到filename指定的文件中-static //对于支持动态链接的系统,使用静态链接而不是动态链接进行链接操作-g //编译时生成debug有关的程序信息(供gdb使用)--save-temps //生成编译过程的中间结果文件(包括预处理文件(x.ii)、汇编代码(x.s)、目标文件(x.o)和最终的可执行文件)-I PATH //在PATH指定的目录下寻找相关的include文件,参数中间不加空格-lxx //其中xx为指定函数库,对于Linux环境下的函数库,静态库后缀为.a,动态库后缀为.so,一般库名为libxx.a或libxx.so,如加入libm.so库,则使用参数-lm(去除lib和后缀.a\so)-L PATH //在PATH指定的目录下寻找相关的库文件,即-lxx指定待链接的库,-L指定寻找该库的路径。不指定时搜索默认的库函数路径。-std=xx //指定编译使用的语言标准-x language //指定待编译文件的语言,而不是由编译器根据文件后缀自行判断。即默认情况下gcc根据文件后缀判断使用的编程语言。例如使用文件名hello作为源文件名是不合适的,应使用hello.c-Wall //输出一些简单的错误以及一些可能存在问题的警告-Wextra //输出-Wall不包含的警告等-Werror //将警告视为错误输出-Wl,option //通过该选项将参数 option 作为后续链接器 ld 使用的参数-Wl,rpath=/path/to/lib //为链接器指定一个非默认的运行时库的搜索路径,运行采用了该选项编译的程序时,链接器会在-rpath 指定的目录中搜索所需的 so 库文件,以将其载入内存中-D name=definition //加入宏定义,若不指定def,则默认为1-O1、-O2 //规定编译器的优化等级,优化级数越高执行效率一般越好,但是优化会改变原有程序结构,使得其汇编不易理解//一些进行缓冲区溢出实验时可能需要的选项-fstack-protector\-fno-stack-protector //是否开启堆栈保护,这里的保护是在返回地址之前加入一个验证值来确保返回地址不被破坏-z execstack //启用可执行栈,默认是禁用的//(echo 0 >/proc/sys/kernel/randomize_va_space 关闭地址随机化,这是一个单独的命令,操作需要root权限)
如果想进行GDB调试的话,需要这样:gcc -g -o GCC GCC.c
gdb 常用命令(1) gdb 可执行文件 : 表示对某个文件进行调试(2) b 函数名/行数 : 在某个函数名或行数前设置断点(3) run/r : 表示开始运行,如果是正在调试的程序的话,表示再次进行调试(4) n/next : 表示执行下一行语句(5) l/list : 列出源码默认10行(当前位置的上下共10行)list 行号 : 列出行号上下共10行的源码list 函数名 : 列出函数名上下共10行的源码(6) s/step : 表示单步执行,进入函数(7) p /x 变量名 : 按16进制输出变量的值/d : 按10进制/o : 按八进制(8) set var 变量名=值 : 设置变量的值(9) bt(backtrace) : 查看各级函数调用及参数,简写bt(10)q/quit : 退出(11)finish : 连续运行到当前函数返回为止,然后停下来等待命令(12)continue/c : 跳转到下个断点,或者跳转到观察点(13)ptype 变量名 : 可以查看变量的类型,简写为pt(14)watch作用:一般用来观察某个变量/内存地址的状态(也可以是表达式),如可以监控该变量/内存值是否被程序读/写情况。有三种方法:1.watch expr(指定变量/内存地址/表达式)一旦expr的值有变化时,将停住程序。2.rwatch expr当expr被读时,停住程序。3.awatch expr当expr被读或被写时,停住程序。watch使用步骤:1. 使用break在要观察的变量所在处设置断点;2. 使用run执行,直到断点;3. 使用watch设置观察点;4. 使用continue观察设置的观察点是否有变化。(15)start : 开始执行程序,停在main函数第一行语句前面等待命令(16)info watchpoints : 列出所有观察点info breakpoints : 查看当前设置的所有断点(17)d/delete [breakpoinsts num] [rang...] d/delete : 删除所有断点d/delete num : 删除breakpoints为num的断点d/delete num1-num2 : 删除breakpoints为num1-num2的断点(18)enable num : 启用num号断点(19)disable num : 关闭num号断点(20)u/until : 结束当前循环```