Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Взгляните на руководство gcc гораздо больше.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

например. для превращения файла .C в вызов .S файла:

gcc -O0 -S test.c

Ответ 6

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

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

Ответ 7

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

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

.... code here .....

#pragma GCC pop_options