Linux gcc что это такое

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 и сборки модулей ядра.

Читайте также:  Бут флешка kali 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 нотации:

  1. Порядок операндов: , — в Intel нотации порядок обратный.
  2. Названия регистров имеют явный префикс % указывающий, что это регистр. То есть %eax, %dl, %esi, %xmm1 и т. д. То, что названия регистров не являются зарезервированными словами, — несомненный плюс.
  3. Явное задание размеров операндов в суффиксах команд: b-byte, w-word, l-long, q-quadword. В командах типа movl %edx, %eax это может показаться излишним, однако является весьма наглядным средством, когда речь идет о: incl (%esi) или xorw $0x7, mask
  4. Названия констант начинаются с $ и могут быть выражением. Например: movl $1,%eax
  5. Значение без префикса означает адрес. Это еще один камень преткновения новичков. Просто следует запомнить, что:
    movl $123, %eax — записать в регистр %eax число 123,
    movl 123, %eax — записать в регистр %eax содержимое ячейки памяти с адресом 123,
    movl var, %eax — записать в регистр %eax значение переменной var ,
    movl $var, %eax — загрузить адрес переменной var
  6. Для косвенной адресации необходимо использовать круглые скобки. Например: movl (%ebx), %eax — загрузить в регистр %eax значение переменной, по адресу находящемуся в регистре %ebx .
  7. SIB-адресация: смещение ( база, индекс, множитель ).

popw %ax /* извлечь 2 байта из стека и записать в %ax */

movl $0x12345, %eax /* записать в регистр константу 0x12345

movl %eax, %ecx /* записать в регистр %ecx операнд, который находится в регистре %eax */

Читайте также:  Windows home server computers

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 — это инструмент, который фактически является сборкой компиляторов для программ, написанных на различных языках программирования. Создан он был давно и активно используется разработчиками по всему миру.

Читайте также:  Mac os snows leopard vmware

Изначально идея 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 и администрированием

Источник

Оцените статью