【问题标题】:Is there a method to suppress default GCC compiler options?有没有一种方法可以抑制默认的 GCC 编译器选项?
【发布时间】:2016-07-13 08:12:05
【问题描述】:

我想只使用我特别提到的编译器选项来编译 C 代码。因此,我需要以某种方式禁用所有自动设置的编译器选项。如何禁用在每次编译期间设置且不可见的默认 GCC 选项。我说的是使用以下命令gcc -Q -v example.c 导致此输出可见的编译器选项:

GNU C (Ubuntu 4.8.4-2ubuntu1~14.04.3) version 4.8.4 (x86_64-linux-gnu)
    compiled by GNU C version 4.8.4, GMP version 5.1.3, MPFR version 3.1.2-p3, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
options passed:  -v -imultiarch x86_64-linux-gnu example.c -mtune=generic
 -march=x86-64 -fstack-protector -Wformat -Wformat-security
options enabled:  -faggressive-loop-optimizations
 -fasynchronous-unwind-tables -fauto-inc-dec -fbranch-count-reg -fcommon
 -fdelete-null-pointer-checks -fdwarf2-cfi-asm -fearly-inlining
 -feliminate-unused-debug-types -ffunction-cse -fgcse-lm -fgnu-runtime
 -fgnu-unique -fident -finline-atomics -fira-hoist-pressure
 -fira-share-save-slots -fira-share-spill-slots -fivopts
 -fkeep-static-consts -fleading-underscore -fmath-errno
 -fmerge-debug-strings -fmove-loop-invariants -fpeephole
 -fprefetch-loop-arrays -freg-struct-return -fsched-critical-path-heuristic
 -fsched-dep-count-heuristic -fsched-group-heuristic -fsched-interblock
 -fsched-last-insn-heuristic -fsched-rank-heuristic -fsched-spec
 -fsched-spec-insn-heuristic -fsched-stalled-insns-dep -fshow-column
 -fsigned-zeros -fsplit-ivs-in-unroller -fstack-protector
 -fstrict-volatile-bitfields -fsync-libcalls -ftrapping-math
 -ftree-coalesce-vars -ftree-cselim -ftree-forwprop -ftree-loop-if-convert
 -ftree-loop-im -ftree-loop-ivcanon -ftree-loop-optimize
 -ftree-parallelize-loops= -ftree-phiprop -ftree-pta -ftree-reassoc
 -ftree-scev-cprop -ftree-slp-vectorize -ftree-vect-loop-version
 -funit-at-a-time -funwind-tables -fvar-tracking -fvar-tracking-assignments
 -fzero-initialized-in-bss -m128bit-long-double -m64 -m80387
 -maccumulate-outgoing-args -malign-stringops -mfancy-math-387
 -mfp-ret-in-387 -mfxsr -mglibc -mieee-fp -mlong-double-80 -mmmx -mno-sse4
 -mpush-args -mred-zone -msse -msse2 -mtls-direct-seg-refs
Compiler executable checksum: a0a649d344b1ed798e33d30772d46437

这里默认的编译器选项可以看成options enabled。如何在不使用例如的情况下禁用这些选项-fno-... 对于他们中的大多数人。有没有一种简单的方法可以正确禁用默认编译器选项?

【问题讨论】:

  • 关闭所有-f... 选项后您希望获得什么?请注意,其中一些选项不能“关闭”,因为它们在两个不同的选项之间进行选择,例如-mlong-double-80 在 128 位和 80 位 long double 之间进行选择。
  • 我想关闭我知道的所有默认编译器选项。之后,我只想设置我主动设置的编译器选项。这对于真正了解激活了哪些编译器选项来编译特定代码是必要的。
  • @FUZxxl:在禁用所有选项的情况下,gcc 处理的方言类似于 1990 年代流行的方言,其中包括许多有用的特性和保证,这些特性和保证从标准中省略,因为存在或可能已经存在平台成本将超过他们的收益。例如,如果代码需要将有符号值按正整数缩放,我认为 gcc 目前将支持 x<<=y; 而不需要例如x=(int32)((uint32_t)x)<<y);,但程序员无法知道下一个 gcc 版本是否需要额外的 -fno-silly-signed-shift 才能使其工作。

标签: c gcc compilation compiler-optimization default-value


【解决方案1】:

使用以下脚本生成所有关闭的-f 选项的列表:

gcc -Q --help=optimizers | sed -e '/^[^[]*$/d' -e 's/ *\[.*$//' -e 's/^  -f/ -fno-/'

将结果保存在名为options.txt 的文件中,并使用@-syntax 将其传递给gcc:

gcc @options.txt ...

请注意,这不会“关闭”其他选项,例如 -m... 选项。它们中的大多数不能被“关闭”,因为它们不是是/否开关,或者因为这样做会改变 ABI。

【讨论】:

  • 是否有任何健全的方法来确保在更新编译器时不会默认启用任何添加到新版本 gcc 的“优化”功能?
  • @supercat 不能保证关闭“关闭”功能标志会使编译器更加宽松。 gcc 是标准 C 的编译器;如果你想编译传统的 C,考虑使用不同的编译器,比如 pcc。
  • “标准 C”是一个神话。一个程序规则非常清楚地表明,该标准的作者希望实现提供超出明确要求的行为,因为它允许实现可能(并且基本原理承认这一点)可能完全符合但完全无用。您能否建议标准的作者提到大多数现有实现如何在结果介于 INT_MAX+1u 和 UINT_MAX 之间的情况下处理 uint1=ushort1*ushort2; 之类的任何原因,如果他们不打算实现的话......跨度>
  • ...没有令人信服的理由不这样做会继续这样做吗?在没有类型别名规则的情况下,通用初始序列规则与联合类型和成员类型之间的强制转换规则相结合,意味着可以使用指向结构的指针来检查另一个结构的通用初始序列,它是使通用初始序列规则有用的能力;我认为没有理由相信该标准曾经打算消除这一点,但 gcc 没有提供符合标准的方式,函数可以通过该方式接受指向结构的指针...
  • ...并使用它来检查任意对象的公共初始序列的成员,即使以单一程序规则所要求的心态阅读标准也会表明标准确实定义了一种方式--gcc 只是忽略它。如果 gcc 的作者不愿意承诺做任何标准未强制要求的事情,那么为什么任何人都应该信任编译器呢?
猜你喜欢
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 2011-11-23
  • 2011-08-23
  • 2011-06-27
相关资源
最近更新 更多