GCC编译选项参数介绍

61 篇文章 52 订阅
18 篇文章 3 订阅

        gcc和g++分别是gnu的c和c++编译器,下面是整理的常用编译选项参数:

#(1). -x: 设定文件所使用的语言,使文件后缀名无效,如下,执行完后生成test.o
gcc -c -x c++ test.jpg
#(2). -c: 只编译生成目标文件即*.o,只编译不链接生成可执行文件,如下,执行完后生成test.o
gcc -c test.cpp
#(3). -S: 把文件编译成为汇编源文件,如下,执行完后生成test.s
gcc -S test.cpp
#(4). -o: 指定生成的可执行文件,输出文件名称,gcc编译出来的文件缺省的是a.out,如下,执行完后生成test执行文件
gcc -o test -c test.cpp
#(5). -ansi: 关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inline typeof关键字,以及UNIX,vax等预处理宏),仅支持ANSI标准的C语法,如下
gcc -ansi -c test.cpp
#(6). -fno-asm: 禁止将asm,inline和typeof用作关键字,如下
gcc -fno-asm -c test.cpp
#(7). -funsigned-char或-fno-signed-char: 对char类型进行设置,将char类型设置成unsigned char,如下
gcc -funsigned-char -c test.cpp
gcc -fno-signed-char -c test.cpp
#(8). -fsigned-char或-fno-unsigned-char: 对char类型进行设置,将char类型设置成signed char,如下
gcc -fsigned-char -c test.cpp
gcc -fno-unsigned-char -c test.cpp
#(9). -include file_name: 在编译test.cpp文件需要aa.hpp文件的时候使用,而此时test.cpp文件中并没有#include "../aa.hpp",相当于在代码中使用#include "../aa.hpp",如下
gcc -c test.cpp -include ../aa.hpp
#(10). -Dmacro_name: 相当于C语言中的#define macro_name,如下
gcc -DTEST_MAIN -c test.cpp
#(11). -Dmacro_name=value: 相当于C语言中的#define macro_name value,如下
gcc -DTEST_MAIN=2 -c test.cpp
#(12). -Umacro_name: 相当于C语言中的#undef macro_name,如下
gcc -Umax -c test.cpp
#(13). -Idir_name: 在test.cpp文件中#include "aa.hpp"文件,而aa.hpp又没有和test.cpp在同一目录下时使用,gcc/g++会到-I指定的目录下查找,即指定额外的头文件搜索路径,如下
gcc -c test.cpp -I../
#(14). -dirafter dir_name: 如果-I指定的目录查找失败,将到这个目录里查找,如下
gcc -c test.cpp -I../../ -idirafter ../
#(15). -nostdinc: 使编译器不再系统缺省的目录里查找头文件,一般和-I一起使用,明确限定头文件的位置
gcc -c test.cpp -I../ -nostdinc
#(16). -C: 在预处理的时候,不删除注释信息,如下
gcc -C -c test.cpp -I../
#(17). -M: 生成文件关联信息,目标文件依赖的所有文件,如下
gcc -M -c test.cpp -I../
#(18). -MM: 生成文件关联信息,与-M相似,但是它将忽略由#include <file>造成的依赖关系,如下
gcc -MM -c test.cpp -I../
#(19). -Wa,option: 此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然后传递给会汇编程序
#(20). -Wl.option: 此选项传递option给链接程序;如果option中间有逗号,就将option分成多个选项,然后传递给会链接程序
#(21). -llibrary_name: 指定链接时搜索指定的库,如下
gcc -c test.cpp -I../ -lpthread
#(22). -Ldir: 指定额外的库搜索路径,如下
gcc -c test.cpp -I../ -L../
#(23). -O0或-O1或-O2或-O3:编译器优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高,如下
gcc -O3 -c test.cpp -I../ -L../
#(24). -g: 指示编译器在编译的时候产生调试信息,如下
gcc -O3 -g -c test.cpp -I../ -L../
#(25). -gstabs: 此选项以stabs格式生成调试信息,但是不包括gdb调试信息,如下 
gcc -O3 -gstabs -c test.cpp -I../ -L../
#(26). -gstabs+: 此选项以stabs格式生成调试信息,并且包含仅供gdb使用的额外调试信息,如下
gcc -O3 -gstabs+ -c test.cpp -I../ -L../
#(27). -ggdb: 此选项将尽可能的生成gdb可以使用的调试信息,如下
gcc -O3 -ggdb -c test.cpp -I../ -L../
#(28). -static: 此选项将禁止使用动态库,一般编译出来的文件比较大,不需要什么动态链接库就可以运行,如下
cc -static -o test -c test.cpp -I../
#(29). -shared: 此选项将尽可能使用动态库,一般编译出来的文件比较小,如下
gcc -shared -o test -c test.cpp -I../
#(30). -tradional: 试图让编译器支持传统的C语言特性,如下
gcc -traditional -o test -c test.cpp -I../
#(31). -E: 预编译后停下来,生成后缀为*.i的预编译文件,如下
gcc -E -o test.i test.cpp -I../
#(32). -w: 不生成任何警告信息,如下
gcc -w -o test -c test.cpp -I../
#(33). -Wall: 生成所有警告信息,如下
gcc -Wall -o test -c test.cpp -I../
#(34). -pedantic: 当gcc在编译不符合ANSI/ISO C语言标准的源代码时,将产生相应的警告信息,如下
gcc -pedantic -o test test.cpp
#(35). -Werror: 要求gcc将所有的警告信息当成错误进行处理,如下
gcc -Werror -o test test.cpp
#(36). -Wcast-align: 当源程序中地址不需要对齐的指针指向一个地址需要对齐的变量地址时则产生一个警告,如下
gcc -Wcast-align -o test test.cpp
#(37). -p或-pg: 会将剖析(profiling)信息加入到最终生成的二进制文件中,剖析信息对于找出程序的性能瓶颈很有帮助,如下
gcc -p -o test test.cpp
gcc -pg -o test test.cpp
#(38). -save-temps: 保存编译过程中生成的一些中间文件,如test.s, test.ii,如下
gcc -save-temps -o test test.cpp
#(40). -pipe: 使用管道代替编译中临时文件,如下
gcc -pipe -o test test.cpp
#(41). -ftime-report: 统计编译消耗的时间并显示报告,如下
gcc -ftime-report -o test test.cpp
#(42). -fmem-report: 显示所有的静态内存分配,如下
gcc -fmem-report -o test test.cpp
#(43). -march: 指定目标架构选项,如下
gcc -march=native -Q --help=target | grep march
#(44). -fpic或-fPIC: 如果支持目标机,编译器就生成位置无关目标码,适用于共享库,如下
gcc -fpic -o test test.cpp
#(45). -fno-rtti: 禁用运行时类型信息,如下
gcc -fno-rtti -o test test.cpp
#(46). -fno-exceptions: 禁用异常机制,如下
gcc -fno-exceptions -o test test.cpp

        更详细的GCC编译选项参数介绍可以参考官网: https://gcc.gnu.org/onlinedocs/gcc/

        GitHub: https://github.com/fengbingchun/Linux_Code_Test  

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: stack-protector 是 GCC 编译器中的一个参数,它可以在程序中增加栈溢出保护机制。该参数会在编译时在程序的栈帧中增加一个额外的保护字段,以便在运行时检测栈溢出。使用该参数可以有效防止栈溢出漏洞的产生。 ### 回答2: GCC编译器参数 stack-protector 是用于在编译时启用堆栈保护机制的选项。堆栈保护是一种防御措施,旨在检测和防止栈溢出攻击。 栈溢出是一种常见的安全漏洞,它发生在栈内存被超出其分配大小的数据覆盖时。攻击者可以通过向缓冲区写入超过其容量的数据来修改目标程序的正常执行流程,并可能导致非法访问、代码执行等安全问题。 启用 stack-protector 参数后,GCC编译时会将堆栈保护代码插入到目标程序中。这些代码会通过检测栈是否被破坏来警告并阻止栈溢出攻击的发生。当检测到栈被破坏时,程序会终止并显示相关错误信息,从而防止攻击者利用栈溢出漏洞执行恶意代码。 具体来说,stack-protector 参数会在栈上分配一个随机的不可覆盖的值,称为"栈冲突保护 canary"。检测发生在函数返回之前或在修改栈上任何变量之前,通过比较 canary 的值是否仍然完好来检测栈是否发生溢出。 使用 stack-protector 参数可以增强目标程序的安全性,防止栈溢出攻击的发生。然而,应该注意,该参数并不能完全解决所有的安全问题,其他安全防御措施如输入验证、内存分配检查等仍然是必要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值