gcc常用编译选项

       -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  打印额外的一些告警信息

原文地址:https://www.cnblogs.com/tongyishu/p/13176975.html