Как отключить оптимизацию компилятора в gcc?
Я пытаюсь выучить ассемблер. Я искал и нашел, как разобрать .c
файл, но я думаю, что он производит некоторую оптимизированную версию программы. Есть ли способ, чтобы я мог видеть точный код сборки, который соответствует моему C-файлу.
5 ответов
Опция gcc -O
позволяет разные уровни оптимизации. использование -O0
отключить их и использовать -S
вывести сборку. -O3
это высший уровень оптимизации.
Начиная с gcc 4.8 уровень оптимизации -Og
доступен. Он включает оптимизации, которые не мешают отладке, и является рекомендуемым значением по умолчанию для стандартного цикла edit-compile-debug.
Чтобы изменить диалект сборки на intel или att use -masm=intel
или же -masm=att
,
Вы также можете включить определенные оптимизации вручную с -fname
,
Посмотрите руководство gcc для гораздо большего.
Чтобы протестировать без копирования elision и увидеть, как вы копируете / перемещаете конструкторы / операторы в действии, добавьте "-fno-elide-constructors".
Даже без оптимизации (-O0) GCC и Clang по-прежнему будут выполнять копирование, что в некоторых случаях приводит к пропуску конструкторов копирования / перемещения. Посмотрите этот вопрос для деталей о копировании elision.
Однако в Clang 3.4 он вызывает ошибку (недопустимый временный объект без вызова конструктора), которая исправлена в 3.5.
Для gcc вы хотите опустить любые опции -O1 -O2 или -O3, передаваемые компилятору, или, если они у вас уже есть, вы можете добавить опцию -O0, чтобы отключить их снова. Это также может помочь вам добавить -g для отладки, чтобы вы могли видеть исходный и дизассемблированный машинный код в вашем отладчике.
Смотрите также: http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html
Используйте ключ -O0 (-[capital o][zero]), чтобы отключить оптимизацию, и -S, чтобы получить файл сборки. Посмотрите здесь, чтобы увидеть больше параметров командной строки gcc.
Вы также можете управлять оптимизацией внутри с помощью #pragma GCC push_options
#pragma GCC push_options
/* #pragma GCC optimize ("unroll-loops") */
.... code here .....
#pragma GCC pop_options
Давным-давно, но все еще нужно.
info - https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
list - gcc -Q --help=optimizers test.c | grep enabled
disable as many as you like with:
gcc **-fno-web** -Q --help=optimizers test.c | grep enabled
Вы можете отключить оптимизацию, если передаете -O0 с помощью командной строки gcc.
Например, чтобы превратить файл.C в вызов файла.S:
gcc -O0 -S test.c