Я пытаюсь изучить язык ассемблера. Я искал и нашел способ дизассемблировать файл .c
, но я думаю, что он создает некоторую оптимизированную версию программы. Есть ли способ, чтобы я мог видеть точный код сборки, который соответствует моему файлу C.
Как отключить оптимизацию компилятора в gcc?
Ответ 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