-c 表示仅仅汇编及编译代码,不进行链接,也就是将源代码编译成 .o 文件
-o 指定输出文件的文件名
-g 调试信息生成,不跟数字默认为-g2,-g1是基本信息的加入,-g3连宏信息都附加进去,附加调试信息显著增加ELF文件大小,但不会影响生成代码的大小
-s 符号表删除
-w 关闭所有警
-D 定义宏,如:gcc –D_DEBUG = 1 -c xxx.c -o xxx
-E 只进行预处理,不汇编
-I 将指定路径添加到include的搜索路径
-S 只进行编译,不汇编
-O 优化选项,后面跟数字表示优化级别,-O0表示不优化,-O1、-O2、-O3优化程度依次递增
-Wall 打开所有的编译告警(实际上只打开大部分,部分要单独开启)
-Werror 将所有的编译告警转化为编译错误,只要有告警就停止编译
-include 在源文件前面含指定的头文件
-fstack-protector 堆栈保护,仅为局部变量中包含长度不小于8 byte的char数组的函数插入保护代码
-fstack-protector-all 为所有的(以下)局部变量插入保护代码:局部变量的地址作为赋值语句的右值或函数参数、局部变量包含数组类型的局部变量(不管数组长度)、带register声明的局部变量
-D_FORTIFY_SOURCE gcc编译器和glibc库配合,协同提供在编译时和运行时对固定大小的(动态分配和静态声明)缓冲区的访问检查,该选项能提供编译时和运行时的双重检查保护,建议和-O2一起使用:-D_FORTIFY_SOURCE=2 –O2
-Wformat 检查printf、scanf等函数调用,以确保提供的参数格式字符串合法有效,不合法则告警
-fPIC –fpic Position-independent Code 为共享库产生位置无关代码
-fPIE –fpie Position-independent Code为可执行文件提供产生位置无关代码
-Wl,-z,now 共享库或程序在加载完成后立即进行符号绑定,一般与-Wl,-z,relro一起使用(完全开启relro)
-Wl,-z,relro 全局偏移表GOT只读(部分开启relro)
-ftrapv 检测加、减、乘三种运算的运行时溢出,并在溢出时触发SIGABRT
-Wl,-z,noexecstack 告知编译器在生成目标文件时,将特定的内存区域(数据段以及堆栈段)标记为不可执行的,这个信息记录在ELF文件的GNU_STACK程序头,内核根据该信息来判定一个进程是否在堆栈及数据段可执行代码。
-Wextra 打印额外的一些告警信息