Я намагаюся вивчити мову асемблера. Я шукав і знаходив, як розібрати .c
файл, але, на мою думку, він видає якусь оптимізовану версію програми. Чи є спосіб, щоб я міг побачити точний код збірки, який відповідає моєму файлу C.
Я намагаюся вивчити мову асемблера. Я шукав і знаходив, як розібрати .c
файл, але, на мою думку, він видає якусь оптимізовану версію програми. Чи є спосіб, щоб я міг побачити точний код збірки, який відповідає моєму файлу C.
Відповіді:
Параметр gcc -O
забезпечує різні рівні оптимізації. Використовуйте -O0
для їх вимкнення та використовуйте -S
для виведення збірки. -O3
- це найвищий рівень оптимізації.
Починаючи з gcc 4.8 -Og
, доступний рівень оптимізації . Це дозволяє оптимізації, які не заважають налагодженню, і є рекомендованим за замовчуванням для стандартного циклу редагування-компіляції-налагодження.
Щоб змінити діалект збірки на intel або att використовуйте -masm=intel
або -masm=att
.
Ви також можете ввімкнути певні оптимізації вручну за допомогою -fname
.
-O0
є типовим (без оптимізації), якщо ви не вказали жодного прапору -O.
Для gcc ви хочете опустити будь-які параметри -O1 -O2 або -O3 , передані компілятору, або якщо вони вже є, ви можете додати опцію -O0, щоб знову вимкнути її. Це також може допомогти вам додати -g для налагодження, щоб ви могли бачити вихідний код c та розібраний машинний код у своєму налагоджувачі.
Див. Також: http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html
Щоб протестувати без копіювання елізії та побачити, як ви копіюєте / переміщуєте конструктори / оператори в дії, додайте "-fno-elide-constructors".
Навіть без оптимізації (-O0), GCC та Clang все одно виконуватимуть копіювання, що в деяких випадках пропускає конструктори копіювання / переміщення. Дивіться це питання, щоб отримати докладні відомості про копіювання.
Однак у Clang 3.4 він справді запускає помилку (недійсний тимчасовий об'єкт без виклику конструктора), що виправлено в 3.5.
Ви можете відключити оптимізацію, якщо передаєте -O0 за допомогою командного рядка gcc.
Наприклад, щоб перетворити файл .C на виклик файлу .S:
тест gcc -O0 -S.c
-O0
є зайвим, оскільки є типовим.