况下进行旧式函数定义); [3] -Wformat、-Wformat=n、-Wformat-security:Wformat、-Wformat=n:检查对 printf 和 scanf 等的调用,以确保提供的参数具有适合指定格式字符串的类型,并且格式字符串中指定的转换是有意义的。这包括 printf、scanf、strftime 和 strfmon(X/Open 扩展,不在 C 标准中)系列(或其他特定于目标的系列)中的标准函数和其他由格式属性(请参阅函数属性)指定的函数。在没有指定格式属性的情况下检查哪些函数取决于所选的标准版本,并且对没有指定属性的函数的这种检查被 -ffreestanding 或 -fno-builtin 禁用;-Wformat-security:如果指定了“-Wformat”,还会警告使用表示可能的安全问题的格式函数。目前,这会警告调用 printf 和 scanf 函数,其中格式字符串不是字符串文字并且没有格式参数,如 printf (foo); [4] -Wformat-nonliteral、-Wno-format-nonliteral :如果指定了 -Wformat,如果格式字符串不是字符串文字并且因此无法检查,也会发出警告,除非格式函数将其格式参数作为 va_list; [5] -fno-builtin、-fno-builtin-function:不识别不以“builtin”作为前缀的内置函数。; [6] -ffreestanding:编译输出(可执行文件)是运行在一个 freestanding environment 环境下。这个选项 包含 -fno-builtin 选项。等同于 -fno-hosted; [7] -O -O0 -O1 -O2 -O3 -Os -Ofast -Og -Oz:-Os相当于-O2.5。是使用了所有-O2的优化选项,但又不缩减代码尺寸的方法; [8] -fstack-protector、-fno-stack-protector、-fstack-protector-all:-fstack-protector:启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码;-fstack-protector-all:启用堆栈保护,为所有函数插入保护代码;-fno-stack-protector:禁用堆栈保护。GCC中的堆栈保护机制; [9] -fdelete-null-pointer-checks/-fno-delete-null-pointer-checks:delete-null-pointer-checks是一种优化手段,通过全局的数据流分析来识别和删除所有对空指针的检测操作;编译器假定对空指针的解引用会造成程序终止。但因为有些环境下,这一结论并不一定成立,而O2,O3和Os时会开启此优化。因此GCC增加了选项-fno-delete-null-pointer-checks; [10] -g:告诉gcc生成并嵌入调试信息; [11] -fstack-usage:为每一个函数输出栈使用信息,每一个源码文件生成一个.su (Stack Usage)文件, su文件中有每一个函数的栈使用信息; [12] -Wstack-usage=byte-size:如果函数的堆栈使用量可能超过字节大小,则发出警告。; [13] -Wdate-time:当遇到宏__TIME_、 宏__DATE__ 、 宏__TIMESTAMP__时发出警告; [14] -Werror=date-time:将指定的警告变成错误; [15] -fpic、-FPIC、-fpie、-fPIE:相同点:都是为了在动态库中生成位置无关的代码。通过全局偏移表(GOT)访问所有常量地址。程序启动时动态加载程序解析GOT条目。不同点:如果链接的可执行文件的GOT大小超过计算机特定的最大大小,则会从链接器收到错误消息,指示-fpic不起作用;在这种情况下,请使用-fPIC重新编译。GOT大小根据操作系统的不同而大小不一样,SPARC上为8k,在AArch64上为28k,在m68k和RS / 6000上为32k。x86没有此限制;-fpie、-fPIE这些选项类似于 -fpic 和 -fPIC,但生成的与位置无关的代码只能链接到可执行文件中。 通常这些选项用于编译将使用 -pie GCC 选项链接的代码。-fpie 和 -fPIE 都定义了宏 pie 和 PIE。 宏的 -fpie 值为 1,-fPIE 值为 2。-fno-pic :生产位置有关代码。 [16] -ffixed-reg:生成的代码不要用寄存器r9,uboot中用来指另做它用; [17] -ffunction-sections、-fdata-sections:在链接生成最终可执行文件时,如果带有-Wl,--gc-sections参数,并且之前编译目标文件时带有-ffunction-sections、-fdata-sections参数,则链接器ld不会链接未使用的函数,从而减小可执行文件大小; [18] -fshort-wchar:强制将wchar_t指定成两个字节,使用这个字段常常是因为wchar_t类型在Windows和Linux平台下字节大小的不同,但这样做只会改变代码中实现的部分,而内部库或者是第三方库中用到的接口和函数都是没有变的,仍然采用的是4字节编码 [19] --gc-sections ,-gc-sections:同上 [20] -fcommon、-fno-common: 指定编译器将未初始化的全局变量放在对象文件的BSS部分。 [21] -mthumb、-marm、-mthumb-interwork、-mno-thumb-interwork:-marm 和-mthumb用来执行生成的代码在arm模式还是thumb模式执行,-mno-thumb-interwork 是指没有ARM/Thumb之间的切换 [22] -mword-relocations:由于使用pic时movt / movw指令会硬编码16bit的地址域,而uboot的relocation并不支持这个, 所以arm平台使用mword-relocations来生成位置无关代码 [23] -mabi=name:这些' -m '选项是为ARM端口定义的,为指定的ABI(Application Binary Interface)生成代码。允许的值是:' apcs-gnu ',' atpcs ', ' aapcs ', ' aapcs-linux '和' iwmmxt '。 [24] -mstrict-align、-mno-strict-align:是否允许非对齐访问; [25] -finstrument-functions:生成函数的进入和退出的检测调用; [26] -pipe:编译的各个阶段之间使用管道而不是临时文件进行通信。这在汇编程序无法从管道读取数据的某些系统上无法工作;但是GNU汇编器没有问题; [27] -march=name:指定目标架构的名称,以及一个或多个可选的特性修饰符; [28] -mgeneral-regs-only:生成只使用通用寄存器的代码。这将防止编译器使用浮点寄存器和高级SIMD寄存器,但不会对汇编程序施加任何限制; [29] -Bdynamic、-Bstatic:-Bdynamic and -Bstatic这两个选项是position-dependent选项,影响后面命令行出现的-lname。-Bdy |