从我们的平台的编译参数上,存在这么几个选项,其中mthumb对代码的size影响较大,下面做一一分析。

-O2 -pipe -g -march=armv7-a -mthumb

-O2

该优化选项会牺牲部分编译速度,除了执行-O1所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法,用以提高目标代码的运行速度。

  • -O, -O1

    这两个命令的效果是一样的,目的都是在不影响编译速度的前提下,尽量采用一些优化算法降低代码大小和可执行代码的运行速度。

  • -O3

    该选项除了执行-O2所有的优化选项之外,一般都是采取很多向量化算法,提高代码的并行执行程度,利用现代CPU中的流水线,Cache等。

  • -Os

    这个优化标识和-O3有异曲同工之妙,当然两者的目标不一样,-O3的目标是宁愿增加目标代码的大小,也要拼命的提高运行速度,但是这个选项是在-O2的基础之上,尽量的降低目标代码的大小,这对于存储容量很小的设备来说非常重要。

  • -Ofast

    该选项将不会严格遵循语言标准,除了启用所有的-O3优化选项之外,也会针对某些语言启用部分优化。

  • -Og

    该标识会精心挑选部分与-g选项不冲突的优化选项,当然就能提供合理的优化水平,同时产生较好的可调试信息和对语言标准的遵循程度。

-march

编译代码时,按照arch参数指定的cpu架构进行编译。

-mthumb

使用这个编译选项生成的目标文件是Thumb指令。

thumb指令集是arm指令集的一个子集,是针对代码密度问题而提出的,它具有16位的代码宽度。与等价的32位代码相比较,thumb指令集在保留32位代码优势的同时,大大的节省了系统的存储空间。

Thumb指令集和ARM指令集比较

  • ARM处理器支持两种指令集:ARM指令集和Thumb指令集。

  • ARM指令集指令长度为32位,Thumb指令集指令长度为16位。在16位外部数据总线宽度下,ARM处理器上使用Thumb指令的性能要比使用ARM指令的性能更好。

  • Thumb指令兼容数据总线宽度为16为的应用系统。

-g选项


目的

生成供符号调试器使用的调试信息。

并使程序状态可用于所选源位置的调试会话,程序状态指的是程序执行过程中某些点的用户变量的值。

您可以使用不同的-g levels来平衡调试功能和编译器优化。

较高的-g levels提供更完整的调试支持,但会牺牲运行时或可能的编译时性能,而较低的-g levels会提供更高的运行时性能,但会牺牲调试会话中的某些功能。

-O2优化级别生效时,完全支持调试功能。

当高于-O2的优化级别生效时,调试功能会受到限制。

默认值

如果未指定-g ,则-g0生效,这意味着编译器不会生成任何调试信息或保留程序状态。

如果指定-g,则默认值如下:

  • 当未启用优化时 ( -qnoopt ),- g等同于-g9

  • -O2优化级别生效时,-g等同于-g2

参数

  • -g0
    不生成调试信息,不保留任何程序状态。

  • -g1
    生成有关行号和源文件名的最少只读调试信息,不保留任何程序状态,此选项等效于-qlinedebug。

  • -g2
    生成有关行号、源文件名和变量的只读调试信息。
    当-O2 或更高优化级别生效时,不会保留任何程序状态。

  • -g8
    生成有关行号、源文件名和变量的只读调试信息。

    当-O2优化级别生效时:

    • 在每个可执行语句的开头,程序状态对调试器可用。
    • 函数参数值在每个函数的开头可供调试器使用。
    • 支持调试内联函数。
  • -g9
    生成有关行号、源文件名和变量的调试信息,可以在调试器中修改变量的值。

    当-O2优化级别生效时:

    • 在每个可执行语句的开头,程序状态对调试器可用。
    • 函数参数值在每个函数的开头可供调试器使用。
    • 支持调试内联函数。

-pipe

-pipe, --pipe
Use pipes between commands, when possible

此标志对生成的代码没有影响,但它使编译过程更快。它告诉编译器在编译的不同阶段使用管道而不是临时文件,这样会占用更多内存。


Supported GCC options
ARM编译器

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐