Как отключить оптимизацию компилятора в gcc? - PullRequest
67 голосов
/ 23 апреля 2011

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

Ответы [ 7 ]

92 голосов
/ 23 апреля 2011

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

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

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

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

Более подробную информацию можно найти в руководстве gcc .

8 голосов
/ 23 апреля 2011

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

См. Также: http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html

6 голосов
/ 23 апреля 2011

Используйте ключ -O0 (- [заглавная o] [ноль]), чтобы отключить оптимизацию, и -S, чтобы получить файл сборки.Посмотрите здесь , чтобы увидеть больше параметров командной строки gcc.

4 голосов
/ 24 июня 2014

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

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

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

1 голос
/ 18 декабря 2018

Давным-давно, но все еще нужно.

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
1 голос
/ 23 апреля 2011

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

Например, чтобы превратить файл .C в вызов файла .S:

gcc -O0 -Stest.c

0 голосов
/ 25 июня 2019

Вы также можете управлять оптимизацией внутри с помощью #pragma GCC push_options

#pragma GCC push_options
/* #pragma GCC optimize ("unroll-loops") */     

.... code here .....

#pragma GCC pop_options
...