Почему GCC использует C11 для C17+ DW_AT_language
Узнайте, почему GCC устанавливает DW_AT_language в C11 даже при компиляции с -std=c17 или более высокими стандартами. Изучите пробелы в реализации, соображения совместимости и будущие улучшения в генерации кодов языка DWARF.
Почему GCC устанавливает DW_AT_language в C11 при компиляции с -std=c17 или более высокими стандартами?
При использовании GCC с флагами -std=c17 или более высокими стандартами (такими как c18 или c2x), атрибут DW_AT_language в отладочной информации DWARF устанавливается в C11 (значение 29), а не в более новый стандарт C. Это поведение можно наблюдать с помощью следующих команд:
$ echo "int x;" | gcc -c -xc - -fPIC -o x.o -g -std=c17
$ gcc -shared -o x.so x.o
$ readelf x.so -w | grep -P '(DW_AT_language\s*:|DWARF Version:)'
<11> DW_AT_language : 29 (C11)
DWARF Version: 5
Это происходит потому, что DW_LANG_C17 и другие более новые коды языков (как указано в стандарте DWARF) еще не реализованы в GCC или readelf?
Почему DW_AT_language имеет значение C11 при компиляции с -std=c17 и выше
При компиляции с GCC с использованием флага -std=c17 или более высоких стандартов, атрибут DW_AT_language последовательно устанавливается в C11 (значение 29) вместо использования более новых кодов языка, таких как DW_LANG_C17. Такое поведение наблюдается несмотря на то, что в исходном коде GCC определен DW_LANG_C17 (0x002c), что указывает на доступность более новых кодов языка, но их неиспользование для стандартов C17 и выше.
Содержание
- [Понимание DW_AT_language в DWARF](#понимание-dw_at_language в-dwarf)
- Реализация кодов языка в GCC
- Почему используется C11 для C17 и выше
- Влияние на инструменты отладки
- Обходные пути и будущие перспективы
- Заключение
Понимание DW_AT_language в DWARF
Атрибут DW_AT_language является важным компонентом отладочной информации DWARF, который идентифицирует язык программирования, использованный в компилируемом модуле. Этот атрибут помогает отладчикам понимать, как интерпретировать код и предоставлять соответствующие возможности отладки.
Стандартные коды языка определены в спецификации DWARF и включают:
- C11: 29 (0x001d)
- DW_LANG_C17: 44 (0x002c)
- DW_LANG_C23: 62 (0x003e)
Из исходного кода GCC видно, что определены более новые коды языка, такие как DW_LANG_C17:
DW_LANG_C17 = 0x002c,
DW_LANG_C23 = 0x003e,
Однако, несмотря на наличие этих констант, GCC по-прежнему выводит коды языка C11 для стандартов C17 и выше.
Реализация кодов языка в GCC
GCC поддерживает полный набор кодов языка в своем заголовочном файле dwarf2.h, что свидетельствует о поддержке более новых стандартов C на уровне реализации. Файл содержит константы для различных языков программирования и стандартов:
DW_LANG_C17 = 0x002c,
DW_LANG_C23 = 0x003e,
DW_LANG_C_plus_plus_17 = 0x002a,
DW_LANG_C_plus_plus_20 = 0x002b,
Это указывает на то, что разработчики GCC подготовили инфраструктуру для более новых кодов языка C, но фактическое использование этих кодов для стандартов C17 и выше противоречит выбору языка.
Почему используется C11 для C17 и выше
Несколько факторов способствуют поведению GCC, при котором используются коды языка C11 для более новых стандартов C:
1. Пробел в реализации
Хотя GCC определяет константы для более новых кодов языка, фактическая логика выбора этих кодов на основе флага -std может быть не полностью реализована. Обсуждение на Stack Overflow указывает на известную проблему, при которой компилятор по умолчанию использует C11 для стандартов выше C11.
2. Совместимость потребителей DWARF
Многие инструменты отладки и потребители DWARF могут еще не полностью поддерживать более новые коды языка. Использование кодов языка C11 обеспечивает более широкую совместимость с существующими отладчиками:
“Это может быть решение, принятое в целях совместимости, чтобы гарантировать, что инструменты отладки, распознающие C11, но не более новые коды языка, все равно могут правильно обрабатывать отладочную информацию.”
3. Эволюция языка против стандарта DWARF
Стандарт C значительно эволюционировал с момента появления C11, но коды языка DWARF могли не обновиться в соответствии с этой эволюцией. GCC может отдавать приоритет практической совместимости вместо семантической точности в отладочной информации.
4. Исторические решения о реализации
Поведение может быть обусловлено историческими решениями, при которых C11 был установлен в качестве базового уровня, а более новые стандарты рассматривались как расширения, а не как отдельные языки.
Влияние на инструменты отладки
Это поведение влияет на то, как инструменты отладки интерпретируют и обрабатывают код, скомпилированный с использованием более новых стандартов C:
Распознавание инструментами
Отладчики, такие как GDB, могут не различать C11, C17, C18 или C2x на основе только атрибута DW_AT_language, поскольку все они отображаются как C11. Это означает:
- Могут не быть правильно включены специфичные для языка функции
- Специфичные для C17 функции, такие как
_Genericс_BitInt, могут не распознаваться - Различия в стандартной библиотеке могут не обрабатываться должным образом
Обнаружение обходных путей
Как показано в примере на Stack Overflow, пользователи могут обнаруживать это поведение, изучая вывод DWARF:
$ echo "int x;" | gcc -c -xc - -fPIC -o x.o -g -std=c17
$ gcc -shared -o x.so x.o
$ readelf x.so -w | grep -P '(DW_AT_language\s*:|DWARF Version:)'
<11> DW_AT_language : 29 (C11)
DWARF Version: 5
Обходные пути и будущие перспективы
Текущие обходные пути
-
Ручное переопределение: Хотя это не поддерживается напрямую, пользователям может потребоваться полагаться на другие атрибуты DWARF или параметры компилятора для указания используемого фактического стандарта.
-
Информация о производителе: Атрибут DW_AT_producer часто содержит точный используемый стандарт:
DW_AT_producer : GNU C17 11.2.0 -mtune=generic -march=x86_64
Будущие улучшения
Наличие констант DW_LANG_C17 в GCC указывает на то, что полная реализация может появиться в будущих версиях. Разработчикам следует:
- Следить за обновлениями GCC в отношении генерации кодов языка DWARF
- Рассмотреть возможность сообщения об этой проблеме как об ошибке или запросе функции, если это влияет на рабочие процессы отладки
- Отслеживать эволюцию стандарта DWARF для обновлений кодов языка
Заключение
Поведение GCC, при котором DW_AT_language устанавливается в C11 для -std=c17 и выше, по-видимому, является комбинацией:
- Пробела в реализации - более новые коды языка существуют, но не выбираются
- Рассмотрений совместимости - обеспечение широкой поддержки отладчиков
- Исторических решений - C11 в качестве установленного базового уровня
Хотя это не препятствует функциональности отладки, это приводит к потере семантической точности относительно фактически используемого стандарта C. Хорошая новость заключается в том, что GCC уже определил необходимые константы (DW_LANG_C17, DW_LANG_C23), что указывает на возможность полной реализации в будущих версиях.
Для пользователей, требующих точной идентификации языка в отладочной информации, за этим поведением следует следить, и следует рассмотреть возможность подачи запросов на улучшения в разработку GCC для обеспечения правильной генерации кодов языка DWARF, соответствующей выбранному стандарту C.