Linux gcc что это такое
Библиотека сайта rus-linux.net
На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Модули ядра Linux | ||
Назад | Окружение и инструменты | Вперед |
Компилятор GCC
Основным компилятором Linux является GCC. Но могут использоваться и другие, некоторые примеры таких иных компиляторов (используемых разными коллективами в Linux) являются: а). компилятор CC из состава IDE SolarisStudio операционной системы OpenSolaris, б). активно развивающийся в рамках проекта LLVM компилятор Clang (кандидат для замены GCC в FreeBSD, причина — лицензия), в). PCC (Portable C Compiler) — новая реализация компилятора 70-х годов, широко практикуемый в NetBSD и OpenBSD. Тем не менее, вся эта альтернативность возможна только в проектах пользовательского адресного пространства; в программировании ядра и, соответственно, модулей ядра применим исключительно компилятор GCC.
Примечание: Существуют экспериментальные проекты по сборке Linux компилятором, отличным от GCC. Есть сообщения о том, что компилятор Intel C имеет достаточную поддержку расширений GCC чтобы компилировать ядро Linux. Но при всех таких попытках пересборка может быть произведена только полностью, «с нуля»: начиная со сборки ядра и уже только потом сборка модулей. В любом случае, ядро и модули должны собираться одним компилятором.
Начало GCC было положено Ричардом Столлманом, который реализовал первый вариант GCC в 1985 на нестандартном и непереносимом диалекте языка Паскаль; позднее компилятор был переписан на языке Си Леонардом Тауэром и Ричардом Столлманом и выпущен в 1987 как компилятор для проекта GNU ( http://ru.wikipedia.org/wiki/GCC ). Компилятор GCC имеет возможность осуществлять компиляцию:
- с нескольких языков программирования (точный перечень зависит от опций сборки самого компилятора gcc );
- в систему команд множества (нескольких десятков) процессорных архитектур;
Достигается это 2-х уровневым процессом: а). лексический анализатор (вариант GNU утилиты bison , от общей UNIX реализации анализатора yacc ; в комплексе с лексическим анализатором flex ) и б). независимый генератор кода под архитектуру процессора.
Одно из свойств (для разработчиков модулей Linux), отличающих GCC в положительную сторону относительно других компиляторов, это расширенная многоуровневая (древовидная) система справочных подсказок, включённых в саму утилиту gcc , начиная с:
gcc (GCC) 4.4.3 20100127 (Red Hat 4.4.3-4)
Copyright (C) 2010 Free Software Foundation, Inc.
И далее . самая разная справочная информация, например, одна из полезных — опции компилятора, которые включены по умолчанию при указанном уровне оптимизации:
$ gcc -Q -O3 —help=optimizer
Для подтверждения того, что установки опций для разных уровней оптимизации отличаются, и уточнения в чём состоят эти отличия, проделаем следующий эксперимент:
$ gcc -Q -O2 —help=optimizer > O2
$ gcc -Q -O3 —help=optimizer > O3
Существует множество параметров GCC, специфичных для каждой из поддерживаемых целевых платформ, которые можно включать при компиляции модулей, например, в переменную EXTRA_CFLAGS используемую Makefile . Проверка платформенно зависимых опций может делаться так:
GCC имеет значительные синтаксические расширения (такие, например, как инлайновые ассемблерные вставки, или использование вложенных функций), не распознаваемые другими компиляторами языка C — ещё и поэтому альтернативные компиляторы вполне пригодны для сборки приложений, но непригодны для пересборки ядра Linux и сборки модулей ядра.
Невозможно в пару абзацев даже просто назвать то множество возможностей, которое сложилось за 25 лет развития проекта, но, к счастью, есть исчерпывающее полное руководство по GCC более чем на 600 страниц, и оно издано в русском переводе [8], которое просто рекомендуется держать под рукой на рабочем столе в качестве справочника.
Ассемблер в Linux
В сложных случаях иногда бывает нужно изучить ассемблерный код, генерируемый GCC как промежуточный этап компиляции. Увидеть сгенерированный GCC ассемблерный код можно компилируя командой с ключами:
$ gcc -S -o my_file.S my_file.c
Примечание: Посмотреть результат ещё более ранней фазы препроцессирования можно, используя редко применяемый ключ -E :
$ gcc -E -o my_preprocessed.c my_file.c
Возможно использование ассемблерного кода для всех типов процессорных архитектур (x86, PPC, MIPS, AVR, ARM, . ) поддерживаемых GCC — но синтаксис записи будет отличаться.
Для генерации кода GCC вызывает as (раньше часто назывался как gas ), конфигурированный под целевой процессор:
Примечание: По моему личному мнению, которое может быть и ошибочно, разработчику модулей ядра Linux совершенно не обязательно умение писать на ассемблере, но в высшей степени на пользу умение хотя бы поверхностно читать написанное не нём. Например, для поиска, в заголовочных файлах или исходных кодах ядра, изменений, произошедших в структурах и API в новой версии ядра.
Нотация AT&T
Ассемблер GCC использует синтаксическую нотацию AT&T, в отличие от нотации Intel (которую используют все инструменты Microsoft, компилятор С/С++ Intel, многоплатформенный ассемблер NASM).
Примечание: Обоснование этому простое — все названные инструменты, использующие нотацию Intel, используют её применительно к процессорам архитектуры x86. Но GCC является много-платформенным инструментом, поддерживающим не один десяток аппаратных платформ, ассемблерный код каждой из этих множественных платформ может быть записан в AT&T нотации.
В AT&T строка записанная как:
Выглядит в Intel нотации так:
Основные принципы AT&T нотации:
- Порядок операндов: , — в Intel нотации порядок обратный.
- Названия регистров имеют явный префикс % указывающий, что это регистр. То есть %eax, %dl, %esi, %xmm1 и т. д. То, что названия регистров не являются зарезервированными словами, — несомненный плюс.
- Явное задание размеров операндов в суффиксах команд: b-byte, w-word, l-long, q-quadword. В командах типа movl %edx, %eax это может показаться излишним, однако является весьма наглядным средством, когда речь идет о: incl (%esi) или xorw $0x7, mask
- Названия констант начинаются с $ и могут быть выражением. Например: movl $1,%eax
- Значение без префикса означает адрес. Это еще один камень преткновения новичков. Просто следует запомнить, что:
movl $123, %eax — записать в регистр %eax число 123,
movl 123, %eax — записать в регистр %eax содержимое ячейки памяти с адресом 123,
movl var, %eax — записать в регистр %eax значение переменной var ,
movl $var, %eax — загрузить адрес переменной var - Для косвенной адресации необходимо использовать круглые скобки. Например: movl (%ebx), %eax — загрузить в регистр %eax значение переменной, по адресу находящемуся в регистре %ebx .
- SIB-адресация: смещение ( база, индекс, множитель ).
popw %ax /* извлечь 2 байта из стека и записать в %ax */
movl $0x12345, %eax /* записать в регистр константу 0x12345
movl %eax, %ecx /* записать в регистр %ecx операнд, который находится в регистре %eax */
movl (%ebx), %eax /* записать в регистр %eax операнд из памяти, адрес которого
находится в регистре адреса %ebx */
Пример: Вот как выглядит последовательность ассемблерных инструкций для реализации системного вызова на exit( EXIT_SUCCESS ) на x86 архитектуре:
Инлайновый ассемблер GCC
GCC Inline Assembly — встроенный ассемблер компилятора GCC, представляющий собой язык макроописания интерфейса компилируемого высокоуровнего кода с ассемблерной вставкой.
Синтаксис инлайн вставки в C-код — это оператор вида:
В простейшем случае это может быть:
asm [volatile] ( «команды ассемблера» );
1. то, как записать несколько строк инструкций ассемблера:
2. пример выполнения системного вызова write() , (показанный ранее в архиве int80.tgz ):
Для чего в случае asm служит ключевое слово volatile ? Для того чтобы указать компилятору, что вставляемый ассемблерный код может давать побочные эффекты, поэтому попытки оптимизации могут привести к логическим ошибкам.
Пример использования ассемблерного кода
Для сравнения того, как внешне выглядит функционально идентичный код, записанный на C ( gas2_0.c ), в виде ассемблерного файла ( gas2_1.c ) и инлайновой ассемблерной вставки ( gas2_2.c ), рассмотрим такой пример (архив gas-prog.tgz); прежде всего его сценарий сборки :
И далее сами файлы реализации:
Убеждаемся, что по исполнению все три варианта абсолютно идентичные:
Источник
команда gcc в Linux с примерами
GCC означает GNU Compiler Collections, которая используется для компиляции в основном языка C и C ++. Он также может быть использован для компиляции Objective C и Objective C ++. Наиболее важной опцией, требуемой при компиляции файла исходного кода, является имя исходной программы, остальные аргументы необязательны, такие как предупреждение, отладка, компоновка библиотек, объектный файл и т. Д. Различные параметры команды gcc позволяют пользователю остановить компиляцию Процесс на разных этапах.
Синтаксис:
Пример: это скомпилирует файл source.c и выдаст выходной файл как файл.out, который является именем по умолчанию для выходного файла, заданного компилятором gcc, который может быть выполнен с использованием ./a.out
Наиболее полезные опции с примерами: Здесь source.c — это файл кода программы C.
- -o opt: это скомпилирует файл source.c, но вместо того, чтобы дать имя по умолчанию, следовательно, выполненное с помощью ./opt , он выдаст выходной файл как opt. -o для опции выходного файла.
-Werror: Это скомпилирует источник и покажет предупреждение, если в программе есть какая-либо ошибка, -W для выдачи предупреждений.
-Wall: при этом будут проверяться не только ошибки, но и предупреждения всех видов, например ошибки неиспользуемых переменных. Рекомендуется использовать этот флаг при компиляции кода.
-ggdb3: эта команда дает нам права на отладку программы с использованием gdb, которая будет описана позже, опция -g предназначена для отладки.
-lm: эта команда связывает библиотеку math.h с нашим исходным файлом, опция -l используется для связывания конкретной библиотеки, для math.h мы используем -lm.
-std = c11: эта команда будет использовать версию стандартов c11 для компиляции программы source.c , которая позволяет определять переменные при инициализации цикла, также с использованием более новой версии стандартов.
-c: эта команда компилирует программу и передает объектный файл в качестве вывода, который используется для создания библиотек.
-v: эта опция используется для подробной цели.
Источник
Что такое компилятор GCC и как его использовать?
Компилятор GCC — это инструмент, который фактически является сборкой компиляторов для программ, написанных на различных языках программирования. Создан он был давно и активно используется разработчиками по всему миру.
Изначально идея GCC заключалась в создании единого пакета программного обеспечения под одной лицензией, которая не позволяла присвоить кому-либо эксклюзивные права на владение данным ПО. Сейчас же данный компилятор используется в качестве стандартного решения для операционных систем семейства Unix и позволяет компилировать программы, написанные на C++, Objective-C, Java, Фортран, Ada и Go.
Если вы впервые сталкиваетесь с этим инструментом, то установка компилятора GCC и его настройка может вызвать определенные трудности. И чтобы они не возникли, далее мы рассмотрим эти процессы подробнее.
Установка компилятора GCC
Чтобы установка компилятора GCC на Ubuntu или любую другую Unix-систему прошла успешно, выполните простую последовательность действий:
- Убедитесь, что ваша система поддерживается нужной вам версией компилятора.
- Скачайте необходимую версию компилятора с официального репозитория.
- Распакуйте и установите выбранную версию компилятора GCC для вашей операционной системы.
- Выполните установку дополнительных компонентов компилятора.
- Настройте GCC в соответствии с вашими требованиями и под вашу операционную систему.
После этого можно считать, что компилятор GCC на Linux установлен. Как уже упоминалось выше, последний этап (настройка) может вызвать сложности, поэтому давайте рассмотрим его подробнее.
GCC-компиляция на Linux: параметры настройки
Конечно, программисту совершенно необязательно знать все доступные опции компилятора GCC, ведь их довольно-таки много. Тем не менее, наиболее часто используемый список под рукой никогда не помешает, ведь данный инструмент позволяет управлять процессом компиляции практически на любом этапе.
В целом параметры компиляции GCC условно можно разделить на две группы. Первая — это так называемые общие настройки, к которым можно отнести:
- @file, где file — нужное имя файла. Выполняет считывание опций из выбранного файла.
- -x language, где language — нужный язык программирования. Принудительно устанавливает выбранный язык программирования.
- -o file — вывод результатов работы.
- -c — прервать работу после компиляции.
- -E — прервать работу после препроцессинга.
- -S — прервать работу после компиляции, но в результате будет выведен код на Ассемблере.
- -v — напечатать команды, которые выполняет компилятор, а также указать его версию.
- —help — вывести основную справку компилятора.
Ко второй группе опций компиляции можно отнести настройки оптимизации, такие как:
- -fno-defer-pop — убрать аргументы из стека функции сразу после выполнения самой функции.
- -fforward-propagate — по возможности упрощать пары инструкций.
- -fauto-inc-dec — если инструкции инкремента и деинкремента отсутствуют, то использовать машинные инструкции.
- -fbranch-count-reg- не использовать инструкции, которые одновременно используют инкремент и деинкремент. Вместо этого — генерировать последовательность инструкций, которые будут выполнять необходимые действия.
- -fcombine-stack-adjustments — оптимизация операций с текстом.
- -fcompare-elim — по возможности избегать инструкций, которые обращаются к флагам процессора.
Теперь вы имеете представление о том, для чего используется GCC-компиляция на Linux и других Unix-системах, а также какие у нее существуют параметры настройки. Для более быстрой компиляции, мы рекомендует заказать выделенный сервер с мощными ресурсами. Остались вопросы? Вы можете задать их специалисту техподдержки RigWEB и получить ответ в течение всего 30 минут.
Создавайте оригинальные программные решения для своих сайтов и пользуйтесь профессиональным хостингом для их размещения в интернете!
Сервер за 3 120 руб с защитой от DDoS и администрированием
Источник