2016-07-13 4 views
2

Я хочу скомпилировать C-код только с параметрами компилятора, которые я конкретно упоминаю. Поэтому мне нужно как-то отключить все параметры компилятора, которые устанавливаются автоматически. Как отключить параметры GCC по умолчанию, которые устанавливаются во время каждой компиляции и не отображаются. Я говорю о параметрах компилятора, которые видны с помощью следующей команды gcc -Q -v example.c, ведущей к этому выходу:Есть ли способ подавить параметры компилятора GCC по умолчанию?

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-... для большинства из них. Есть ли простой способ правильно отключить параметры компилятора по умолчанию?

+1

Что вы ожидаете получить от отключения всех параметров '-f ... '? Обратите внимание, что некоторые из этих параметров нельзя отключить, поскольку они выбирают между двумя различными вариантами выбора, например. '-mlong-double-80' выбирает между 128 бит и 80 бит' long double'. – fuz

+0

Я хотел бы отключить все параметры компилятора по умолчанию, о которых я знаю. После этого я хочу установить только параметры компилятора, которые я активно устанавливаю. Это необходимо, чтобы действительно знать, какие параметры компилятора активированы для компиляции определенного кода. – Maximilian

+0

@FUZxxl: при отключенных параметрах gcc обрабатывает диалект, подобный популярному в 1990-е годы, который включает в себя множество полезных функций и гарантий, которые были исключены из Стандарта, поскольку были или могут быть платформы, где их стоимость будет превышать их преимущества. Если, например, код должен масштабировать знаковое значение положительным целым числом, я думаю, что gcc теперь будет поддерживать 'x << = y;', а не требовать, например, 'x = (int32) ((uint32_t) x) << y);', но у программиста не будет возможности узнать, потребует ли следующий выпуск gcc дополнительный '-fno-silly-signed-shift', чтобы сделать это Работа. – supercat

ответ

2

Используйте следующий сценарий для создания списка всех отключенных -f вариантов:

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

Сохранить результат в файл с именем options.txt и передать его в GCC с @ -syntax:

gcc @options.txt ... 

Обратите внимание, что это не отключает другие опции, такие как -m.... Большинство из них нельзя отключить либо потому, что они не являются да/нет, либо потому, что это изменит ABI.

+0

Будет ли разумный способ гарантировать, что любые функции оптимизации, добавленные в новые версии gcc, не включаются по умолчанию при обновлении компилятора? – supercat

+0

@supercat Отключение флагов функции «off» не гарантирует, что компилятор станет более мягким. gcc - это компилятор для стандартного C; если вы хотите скомпилировать традиционный C, подумайте об использовании другого компилятора, такого как pcc. – fuz

+0

«Стандарт С» - это миф. Правило единой программы ясно показывает, что авторы Стандарта предполагали, что реализации обеспечивают поведение, выходящее за рамки явно требуемого, поскольку оно позволяет использовать возможность (и обоснование), что реализация может быть полностью совместимой и все же бесполезной. Можете ли вы предложить любую причину, по которой авторы Стандарта упомянули, как большинство существующих реализаций будут обрабатывать нечто вроде 'uint1 = ushort1 * ushort2; 'в тех случаях, когда результат был между INT_MAX + 1u и UINT_MAX, если они не предполагали, что реализации ... – supercat

Смежные вопросы