-g указывает компилятору хранить информацию таблицы символов в исполняемом файле. Среди прочего, это включает в себя:
- имена символов
- введите информацию для символов
- файлов и номеров строк, откуда появились символы
Отладчики используют эту информацию для вывода значимых имен символов и связывания инструкций с конкретными строками в источнике.
Для некоторых компиляторов указание -g отключит некоторые оптимизации. Например, icc устанавливает уровень оптимизации по умолчанию на -O0 с помощью -g, если вы явно не укажете -O [123]. Кроме того, даже если вы введете -O [123], оптимизации, которые препятствуют трассировке стека, все равно будут отключены (например, извлечение указателей кадров из кадров стека. Это оказывает лишь незначительное влияние на производительность).
В некоторых компиляторах -g отключит оптимизации, которые могут запутать, откуда взялись символы (переупорядочение команд, развертывание цикла, вставка и т. Д.). Если вы хотите отладить с оптимизацией, вы можете использовать -g3 с gcc, чтобы обойти это. Дополнительная информация отладки будет включена в макросы, расширения и функции, которые могли быть встроены. Это может позволить отладчикам и инструментам производительности отображать оптимизированный код в исходный код, но это лучшее усилие. Некоторые оптимизации действительно портят код.
Для получения дополнительной информации взгляните на DWARF , формат отладки, изначально разработанный для соответствия ELF (двоичный формат для Linux и других ОС).