Как отключить оптимизацию компилятора в GCC?


Я пытаюсь выучить язык ассемблера. Я искал и нашел как разобрать .c файл, но я думаю, что он производит некоторую оптимизированную версию программы. Есть ли способ, чтобы я мог видеть точный ассемблерный код, который соответствует моему c-файлу.

5 57

5 ответов:

опция gcc -O включает различные уровни оптимизации. Используйте -O0 отключить их и использовать -S для вывода ассамблеи. -O3 Это самый высокий уровень оптимизации.

начиная с gcc 4.8 уровень оптимизации -Og доступно. Это позволяет оптимизировать, которые не мешают отладке и рекомендуется по умолчанию для стандартного цикла редактирования-компиляции-отладки.

чтобы изменить диалект сборки на intel или att используйте -masm=intel или -masm=att.

вы также можете включить некоторые оптимизации вручную с помощью -fname.

посмотреть руководство gcc гораздо больше.

для gcc вы хотите опустить любой - O1-O2 или - O3 параметры, переданные компилятору, или если они у вас уже есть, вы можете добавить - O0 возможность отключить его снова. Это также может помочь вам добавить - g для отладки, чтобы вы могли видеть исходный и разобранный машинный код c в своем отладчике.

Смотрите также:http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html

используйте переключатель-O0 (- [capital o][zero]) для отключения оптимизации и-S для получения файла сборки. Смотри здесь для просмотра дополнительных параметров командной строки gcc.

чтобы проверить без копирования elision и увидеть, как вы копируете / перемещаете конструкторы / операторы в действии, добавьте "-fno-elide-constructors".

даже без оптимизации (- O0 ), GCC и Clang по-прежнему будут выполнять копирование elision, что в некоторых случаях приводит к пропуску конструкторов копирования/перемещения. Смотрите этот вопрос для получения подробной информации о копировании elision.

однако в Clang 3.4 он вызывает ошибку (недопустимый временный объект без вызова конструктора), которая исправлена в 3.5.

вы можете отключить оптимизацию, если вы передаете -O0 с помощью командной строки gcc.

например, чтобы повернуть a .C файл в a .Файл звонок:

GCC-O0-s тест.c