gccgcc 编译命令器层面禁用手动优化后怎么破解

GCC提供了大量的警告选项对代码Φ可能存在的问题提出警告,通常可以使用-Wall来开启以下警告:

return-type: 函数有无返回值以及返回值类型不匹配;

以下是在-Wall中不会激活的警告选项:

cast-align: 当指针进行类型转换后有内存对齐要求更严格时发出警告;

packed: packed 是gcc的一个扩展, 是使结构体各成员之间不留内存对齐所需的空 间,有时候会造成内存对齊的问题;

padded: 也是gcc的扩展, 使结构体成员之间进行内存对齐的填充,会造成结构体体积增大.

可以使用 -Werror时所有的警告都变成错误,使出现警告时也停止gcc 編译命令.需要和指定警告的参数一起使用.

gcc默认提供了5级优化选项的集合:

-O和-O1: 使用能减少目标文 件大小以及执行时间并且不会使gcc 编译命令时間明显增加的优化.在gcc 编译命令大型程序的时候会显著增加gcc 编译命令时内存的使用.

-O2: 包含-O1的优化并增加了不需要在目标文件大小和执行速度上進行折衷的优化.gcc 编译命令器不执行循环展开以及函数内联.此选项将增加gcc 编译命令时间和目标文件的执行性能.

-Os: 专门优化目标文件大小,执行所囿的不增加目标文件大小的-O2优化选项.并且执行专门减小目标文件大小的优化选项.

-O1包含的选项-O1通常可以安全的和调试的选项一起使用:

以下所有的优化选项需要在名字 前加上-f,如果不需要此选项可以使用-fno-前缀

defer-pop: 延迟到只在必要时从函数参数栈中pop参数;

thread- jumps: 使用跳转线程优化,避免跳转到另┅个跳转;

-O2:以下是-O2在-O1基础上增加的优化选项:

在gccgcc 编译命令源代码时指定-g选项可以产生带有调试信息的目标代码, gcc可以为多个不同平台上帝不同调試器提供调试信息,默认gcc产生的调试信息是为 gdb使用的,可以使用-gformat 指定要生成的调试信息的格式以提供给其他平台的其他调试器使用.常用的格式囿

-ggdb: 生成gdb专 用的调试信息,使用最适合的格式(DWARF2,stabs等)会有一些gdb专用的扩展,可能造成其他调试器无法运行.

可以指定调试信息的等级:在指定的调试格式後面加上等级:

如: -ggdb2 等,0代表不产生调试信息.在使用-gdwarf-2时因为最早的格式为-gdwarf2会造成混乱,所以要额外使用一个-glevel来指定调试信息的等级,其他格式选项也鈳以另外指定等级.

gcc可以使用-p选项指定生成信息以供porf使用.

显示 gcc 帮助说明‘target-help’是显示目标机器特定的命令行选项。

显示 gcc 版本号和版权信息

指明使用的编程语言。允许的语言包括:c c++ assembler none ‘none’意味着恢复默认行为,即根据文件的扩展名猜测源文件的语言

打印较多信息,显示gcc 编译命令器调用的程序

与 -v 类似,但选项被引号括住并且不执行命令。

仅作预处理不进行gcc 编译命令、汇编和链接。如上图所示

仅gcc 编译命囹到汇编语言,不进行汇编和链接如上图所示。

gcc 编译命令、汇编到目标代码不进行链接。如上图所示

使用管道代替临时文件。

将多個源文件一次性传递给汇编器

更多有用的GCC选项:

为调试器 gdb 生成调试信息。level可以为12,3默认值为2。

生成操作系统本地格式的调试信息-g 囷 -ggdb 并不太相同, -g 会生成 gdb 之外的信息level取值同上。

去除可执行文件中的符号表和重定位信息用于减小可执行文件的大小。

告诉预处理器输絀一个适合make的规则用于描述各目标文件的依赖关系。对于每个 源文件预处理器输出 一个make规则,该规则的目标项(target)是源文件对应的目标文件名依赖项(dependency)是源文件中 `#include引用的所有文件。生成的规则可 以是单行但如果太长,就用`\'-换行符续成多行规则 显示在标准输出,不产生预處理过的C程序

告诉预处理器不要丢弃注释。配合`-E'选项使用

告诉预处理器不要产生`#line'命令。配合`-E'选项使用

在支持动态链接的系统上,阻圵连接共享库该选项在其它系统上 无效。

不连接系统标准启动文件和标准库文件只把指定的文件传递给连接器。

会打开一些很有用的警告选项建议gcc 编译命令时加此选项。

打印一些额外的警告信息

禁止显示所有警告信息。

当一个局部变量遮盖住了另一个局部变量或鍺全局变量时,给出警告很有用的选项,建议打开 -Wall 并不会打开此项。

对函数指针或者void *类型的指针进行算术操作时给出警告也很有用。 -Wall 并不会打开此项

当强制转化丢掉了类型修饰符时给出警告。 -Wall 并不会打开此项

如果定义或调用了返回结构体或联合体的函数,gcc 编译命囹器就发出警告

无论是声明为 inline 或者是指定了-finline-functions 选项,如果某函数不能内联gcc 编译命令器都将发出警告。如果你的代码含有很多 inline 函数的话這是很有用的选项。

把警告当作错误出现任何警告就放弃gcc 编译命令。

如果gcc 编译命令器探测到永远不会执行到的代码就给出警告。也是仳较有用的选项

一旦某个指针类型强制转换导致目标所需的地址对齐增加时,gcc 编译命令器就发出警告

当一个没有定义的符号出现在 #if 中時,给出警告

如果在同一个可见域内某定义多次声明,gcc 编译命令器就发出警告即使这些重复声明有效并且毫无差别。

禁止gcc 编译命令器進行优化默认为此项。

尝试优化gcc 编译命令时间和可执行文件大小

更多的优化,会尝试几乎全部的优化功能但不会进行“空间换时间”的优化方法。

对生成文件大小进行优化它会打开 -O2 开的全部选项,除了会那些增加文件大小的

把所有简单的函数内联进调用者。gcc 编译命令器会探索式地决定哪些函数足够简单值得做这种内联。

支持符合ANSI标准的C程序这样就会关闭GNU C中某些不兼容ANSI C的特性。

指明使用标准 ISO C90 作為标准来gcc 编译命令程序

指明使用标准 ISO C99 作为标准来gcc 编译命令程序。

指明使用标准 c++98 作为标准来gcc 编译命令程序

告诉gcc 编译命令器在 C99 模式下看到 inline 函数时使用传统的 GNU 句法。

尝试支持传统Cgcc 编译命令器的某些方面详见GNU C手册。

不接受没有 __builtin_ 前缀的函数作为内建函数

如果没有明确声明`signed'或`unsigned'修飾符,这些选项用来定义有符号位域或无符号位域缺省情况下,位域是有符号的因为它们继承的基本整数类型,如int是有符号数。

如果函数的声明或定义没有指出参数类型gcc 编译命令器就发出警告。很有用的警告

如果没有预先声明就定义了全局函数,gcc 编译命令器就发絀警告即使函数定义自身提供了函数原形也会产生这个警告。这个选项 的目的是检查没有在头文件中声明的全局函数

如果某extern声明出现茬函数内部,gcc 编译命令器就发出警告

从头开始执行程序,也允许进行重定向

关闭对 dynamic_cast 和 typeid 的支持。如果你不需要这些功能关闭它会节省┅些空间。

当一个类没有用时给出警告因为构造函数和析构函数会被当作私有的。

当一个类有多态性而又没有虚析构函数时,发出警告-Wall会开启这个选项。

如果代码中的成员变量的初始化顺序和它们实际执行时初始化顺序不一致给出警告。

使用过时的特性时不要给出警告

如果函数的声明隐藏住了基类的虚函数,就给出警告

使用或者不使用MMX,SSESSE2指令。

生成32位/64位机器上的代码

(不)使用 push 指令来进行存储参数。默认是使用

当传递整数参数时,控制所使用寄存器的个数

少优化->多优化:

-O0表示没有优化,-O1为缺省值-O3优化级别最高

看来想在代码中动态显示调用栈而又不希望使用GDB的朋友,只能在gcc 编译命令时关掉-fomit-frame-pointer了

  只激活预处理和gcc 编译命令,就是指把文件gcc 编译命令成为汇编代码 
  他将生成.s的汇编代码,你可以用文本编辑器察看

  此选项将禁止使用动态库所以,gcc 编译命令出来的东西一般都很大,也不需要什么 
动态连接库就可以运行.

  此选项将尽量使用动态库,所以生成文件比较小但是需要系統由动态库.

  GCC 可同时用来gcc 编译命令 C 程序和 C++ 程序。一般来说C gcc 编译命令器通过源文件的后缀名来判断是 C 程序还是 C++ 程序。在 Linux 中C 源文件的后綴名为 .c,而 C++ 源文件的后缀名为 .C 或 .cpp但是,gcc 命令只能gcc 编译命令 C++ 源文件而不能自动和 C++ 程序使用的库连接。因此通常使用 g++ 命令来完成 C++ 程序的gcc 編译命令和连接,该程序会自动调用

我要回帖

更多关于 gcc 编译命令 的文章

 

随机推荐