gcc见过的编译选项

一、-ffixed-x18

-ffixed-x18 是GCC编译器的一个选项,它用于指定寄存器x18在函数调用时被预留不可使用。x18是ARM体系结构上的一个寄存器。

通过使用-ffixed-x18选项,编译器会将寄存器x18保留为固定的,禁止在函数中使用它来存储临时变量或执行其他操作。这通常用于特定的场景,例如在操作系统的内核或某些特殊的编程需求中。

二、-Wstrict-prototypes

-Wstrict-prototypes 是GCC编译器的一个警告选项,它用于启用在函数声明中强制检查函数参数类型的严格规则。该选项会在以下情况下发出警告:

函数声明中参数没有指定类型。
函数声明中参数声明中使用了缺省类型。
通过使用-Wstrict-prototypes选项,编译器会强制要求所有函数声明中的参数类型必须显式指定,在这种情况下,如果函数声明中遗漏了参数类型或者参数使用了缺省类型,编译器将会发出警告。

三、-Wno-format-security

-Wno-format-security 是GCC编译器的一个选项,它用于禁用有关格式化字符串函数的安全性警告。格式化字符串函数(如printf、scanf等)接受一个格式化字符串作为参数,而这些字符串中的格式控制符和对应的参数类型必须匹配,否则可能导致安全漏洞,比如格式化字符串攻击。

通过使用-Wno-format-security选项,编译器会禁用与格式化字符串函数相关的安全性警告。这意味着即使代码中存在格式化字符串在使用上可能有问题的情况,编译器也不会报出相应的警告信息。

四、-g

-g 是GCC编译器的一个选项,它用于在生成的可执行文件或调试信息文件中,包含额外的调试信息。这些调试信息可以被调试器用来跟踪源代码与可执行代码之间的映射关系,以及在调试时查看变量的值和执行流程。

通过使用-g选项,编译器会在编译过程中将调试信息嵌入到生成的目标文件中。这样,生成的可执行文件或调试信息文件就能包含与源代码相关的调试信息。

五、-fno-builtin

-fno-builtin 是GCC编译器的一个选项,它用于禁用内建函数的替换功能。GCC编译器会对一些常见的函数(如memcpy、strlen等)提供内建版本,这些内建函数通常优化后的,能够提供更好的性能。而使用-fno-builtin选项可以禁用这种替换,让编译器使用库中提供的函数而非内建版本。

通过使用-fno-builtin选项,编译器会禁用对内建函数的替换,在编译过程中会使用库中提供的函数实现。

六、-ffreestanding

-ffreestanding 是GCC编译器的一个选项,它用于指定使用自由环境编译,即编译一个独立的、没有操作系统支持的可执行文件。这个选项通常用于嵌入式系统或操作系统内核开发,其中不依赖于标准库和操作系统函数的可执行文件。

通过使用-ffreestanding选项,编译器会假设没有默认的库、运行时环境或操作系统支持,并且不进行一些特定于主机环境的优化,以便执行更精确的编译。

七、-Wno-unused-function

-Wno-unused-function 是GCC编译器的一个选项,用于禁止在编译过程中生成关于未使用函数的警告信息。默认情况下,编译器会对未使用的函数发出警告,因为这可能是代码中的潜在问题,例如定义了但从未调用的函数。

通过使用-Wno-unused-function选项,编译器将不再生成未使用函数的警告信息,即禁用了这个警告。

八、-Wno-implicit-function-declaration

-Wno-implicit-function-declaration 是GCC编译器的一个选项,用于禁止在编译过程中生成关于隐式函数声明的警告信息。默认情况下,如果在源代码中使用了没有显式声明的函数,编译器会发出警告,因为这可能导致运行时错误。

通过使用-Wno-implicit-function-declaration选项,编译器将不再生成隐式函数声明的警告信息,即禁用了这个警告

九、-Os

-Os 是GCC编译器的一个优化选项,用于优化输出代码的尺寸(size)。

通过使用-Os选项,编译器将使用一系列优化策略来尽量减小生成的可执行文件的大小,而不会过多关注执行速度方面的优化。这样可以在一定程度上减小可执行文件的尺寸,适用于有限资源的嵌入式系统或对文件大小有限制的场景。
需要注意的是,使用-Os选项可能会牺牲一些执行速度。因此,在选择优化选项时,需要权衡尺寸和性能的需求,并选择最适合的选项

十、 -fno-stack-protector

-fno-stack-protector 是GCC编译器的一个选项,用于禁用栈保护机制。

栈保护是一种编译器使用的安全措施,用于检测缓冲区溢出漏洞。当启用栈保护时,编译器会在栈帧上插入一些随机值,然后在函数返回时检查这些值是否被修改。如果检测到栈帧被篡改,程序会中止执行,以防止潜在的安全漏洞。

通过使用-fno-stack-protector选项,编译器将禁用栈保护机制,即不再在栈帧中插入随机值进行检测。

十一、-fno-delete-null-pointer-checks

-fno-delete-null-pointer-checks 是GCC编译器的一个选项,用于禁用对空指针缺陷的检查和优化。

在C或C++程序中,如果使用了空指针进行操作(比如对空指针解引用),会导致程序崩溃,因为空指针没有有效的内存地址。编译器通常会在编译过程中对这些空指针进行检查,以确保程序的健壮性和安全性。

通过使用-fno-delete-null-pointer-checks选项,编译器将禁用对空指针缺陷的检查和优化,即不再处理空指针相关的警告和错误。

十二、-fstack-usage

-fstack-usage 是GCC编译器的一个选项,用于生成一个用于静态分析函数调用树的报告,以显示每个函数在栈上使用的字节数。

通过使用-fstack-usage选项,编译器将分析程序的函数调用树,并输出每个函数在栈上使用的字节数。这可以帮助开发者了解程序在栈上的内存使用情况,以便进行性能优化或调试。

十三、-Wno-format-nonliteral

-Wno-format-nonliteral 是GCC编译器的一个选项,用于禁用对非字面格式字符串的警告。

在C或C++程序中,当使用格式化字符串作为printf、scanf和类似函数的参数时,编译器通常会检查格式字符串是否为字面值(即硬编码的字符串),以便进行静态分析和优化。如果使用了非字面格式字符串,编译器会发出警告,因为这可能导致格式化字符串漏洞或其他安全问题。

通过使用-Wno-format-nonliteral选项,编译器将禁用对非字面格式字符串的警告,即不再对使用非字面格式字符串的代码发出警告。

十四、-Werror=date-time

-Werror=date-time 是GCC编译器的一个选项,用于将有关日期和时间的警告视为错误。

在编译C或C++程序时,编译器可能会发出有关日期和时间的警告,比如对__DATE__、__TIME__宏的使用或者对日期时间格式的错误使用。这些警告通常是为了防止代码在不同的编译环境下产生不一致的结果。

通过使用-Werror=date-time选项,编译器将把有关日期和时间的警告视为错误,即将警告转化为编译错误,编译过程将中止。

十五、-fno-toplevel-reorder

-fno-toplevel-reorder 是GCC编译器的一个选项,用于禁用对全局变量初始化的重排序。

在C或C++程序中,全局变量的初始化顺序有时是不确定的。编译器可能会对全局变量的初始化顺序进行重新排列,以提高代码的执行效率。然而,这种重排序可能会导致代码执行出现问题,特别是当一个全局变量的初始化依赖于另一个全局变量的值时。

通过使用-fno-toplevel-reorder选项,编译器将禁用对全局变量初始化的重排序,即不再对全局变量的初始化顺序进行优化

十六、-Wstrict-aliasing

-Wstrict-aliasing 是GCC编译器的一个选项,用于启用严格的类型别名规则,并发出严格别名规则的相关警告。

在C或C++程序中,别名是指对同一内存位置使用不同类型的指针,这在编译器优化和类型安全方面可能引起一些问题。为了确保符合语言标准和编译器优化的需求,GCC提供了-Wstrict-aliasing选项来对类型别名进行严格约束,并输出相关警告。

通过使用-Wstrict-aliasing选项,编译器将启用严格的类型别名规则,并在编译过程中发出与严格别名规则相关的警告。这可以帮助开发者检查程序中可能存在的别名问题,从而提高程序的可靠性和可移植性。

十七、-ffunction-sections

-ffunction-sections 是GCC编译器的一个选项,用于将每个函数放入单独的代码段中。

在C或C++程序中,函数的定义和调用通常都存在于同一个代码段中。使用-ffunction-sections选项,编译器将会将每个函数放入单独的代码段中,这样可以实现更细粒度的代码组织和更精确的链接控制。

使用-ffunction-sections选项的主要优势在于代码尺寸的控制和优化。通过将每个函数放入单独的代码段,可以实现更好的代码压缩效果,减少可执行文件的尺寸。此外,在链接时,可以选择性地仅包含使用的函数,从而进一步减少可执行文件的尺寸。

十八、-fno-pic

-fno-pic 是GCC编译器的一个选项,用于禁用生成位置独立代码(PIC)的优化。

位置独立代码是一种机器代码的生成方式,用于支持可在不同内存地址加载和执行的可执行文件或共享库。在生成位置独立代码时,编译器会插入额外的指令和处理逻辑,以确保代码能够正确地在不同位置加载和执行。

使用-fno-pic选项,编译器将禁用生成位置独立代码的优化,即不会插入额外的指令和处理逻辑。相反,生成的代码将仅适用于特定的内存地址,可能会导致可执行文件或共享库只能在固定位置加载和执行。

十九、-fdata-sections

-fdata-sections 是GCC编译器的一个选项,用于将每个数据对象放入单独的数据段中。

在C或C++程序中,全局变量和静态变量通常都位于相同的数据段中。使用-fdata-sections选项,编译器将会将每个数据对象放入单独的数据段中,这样可以实现更细粒度的数据组织和更精确的链接控制。

使用-fdata-sections选项的主要优势在于数据尺寸的控制和优化。通过将每个数据对象放入单独的数据段,可以实现更好的数据压缩效果,减少可执行文件或共享库的尺寸。此外,在链接时,可以选择性地仅包含使用的数据对象,从而进一步减少可执行文件或共享库的尺寸。

二十、-fno-common

-fno-common 是GCC编译器的一个选项,用于禁用以传统方式处理未初始化的全局变量或静态变量。

在C或C++程序中,如果全局变量或静态变量没有显式地初始化,编译器默认会将它们放在一个通用的COMMON段中。这意味着它们的内存空间不是在编译时分配,而是在链接时分配。这种处理方式存在一些问题,如无法进行静态空间分配优化和共享对象的链接问题。

使用-fno-common选项,编译器将禁用以传统方式处理未初始化的全局变量或静态变量。相反,编译器会将未初始化的全局变量或静态变量都视为无效的声明,并将它们放在一个特殊的BSS段中。这样,内存空间会在编译时就分配好,从而能够进行更好的优化和链接控制。

二十一、-pipe

-pipe 是GCC编译器的一个选项,用于改变编译器在不同阶段之间传递中间结果的方式。

默认情况下,GCC编译器在不同阶段(如预处理、编译、汇编、链接)之间传递中间结果时,会将结果写入临时文件,然后再读取。这种方式可以确保不同阶段之间的数据完整,但是会产生额外的I/O开销。

使用-pipe选项,编译器会在不同阶段之间使用内存缓冲区代替临时文件,从而避免磁盘I/O的开销。这样可以加快编译过程的速度,尤其在项目规模较大时的差异可能更为明显。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值