Компилятор Linux - gcc/g++ (предварительная обработка, компиляция, сборка, компоновка)

Предисловие:
В этой статье в основном рассматриваются и изучаются Linuxчасто используемые компиляторы в среде — gcc(скомпилированный Cкод)/ g++(скомпилированный C++код) общие инструкции и т. д., две основные среды для реализации программ, понимание динамических библиотек и статических библиотек и т. д.

1. Две среды для реализации программы

Реализация любой Cпрограммы должна проходить через среду трансляции и среду исполнения .

В среде перевода он разделен на четыре части: предварительная компиляция, компиляция, сборка и компоновка . Основные задачи, которые необходимо решить на каждом этапе:

  1. Прекомпиляция (препроцессинг): включение заголовочных файлов, удаление комментариев, замена символов #define
  2. Компиляция: преобразование кода языка C в ассемблерный код
  3. Сборка: преобразование инструкций по сборке в двоичные инструкции
  4. Ссылка: объединить таблицу символов и таблицу сегментов для создания исполняемой программы

вставьте сюда описание изображения

2. Как завершить gcc

gccФайлы, сформированные на каждом этапе, можно просмотреть с помощью различных опций команды

Формат: gcc [опция] [имя файла объекта] -o [создать имя файла]

Сначала Test.cнапишите Cкод в файле:

//Test.c
#include<stdio.h>
 
#define N 100
 
//这是一段注释.....
 
int main()
{
    
    
	int n = 0;
	printf("Hello World\n");
	printf("%d\n", n + N);
	return 0;
}

1. Предварительная обработка

Просмотр Test.cпредварительно обработанных результатов, -Eфункция опции — gccостановить процесс компиляции после завершения препроцессинга, -oфункция — сохранить предварительно обработанный контент в test.iфайл

gcc -E Test.c -o test.i

вставьте сюда описание изображения

Как показано на рисунке, на этапе предобработки выполняется включение заголовочного файла, удаление комментария, замена #define и т.д.

2. компилировать

Затем скомпилируйте только что сгенерированный test.i, остановитесь после компиляции и запишите результат в test.s. gccИспользуемые варианты -S.

gcc -S test.i -o test.s

вставьте сюда описание изображения

Хоть мы и не изучили язык ассемблера, но все же смутно понимаем, что это ассемблерные коды, видно, что стадия компиляции заключается в переводе кода C в ассемблерные инструкции.

3. Компиляция

gccИспользовались следующие опции -c: -o записать результаты в test.o .

gcc -c test.s -o test.o

вставьте сюда описание изображения
Как мы видим, после завершения компиляции появляются такие искаженные символы. По сути, после компиляции сгенерированный файл представляет собой бинарный файл, который используется для показа компьютеру, и мы уже не можем его понять.

4. ссылка

После завершения компиляции он переходит в стадию компоновки, а исполняемая программа будет сгенерирована после завершения компоновки test.

gcc test.o -o Test

вставьте сюда описание изображения

Но со ссылками нам нужно знать, на что они ссылаются.
Например, почему не определена функция printf, return... и т. д., но ее функции можно использовать?

Фактически система помещает реализацию этих функций libc.so.6в библиотечный файл с именем .Если нет специального обозначения, она будет искать в gccпути поиска системы по умолчанию , то есть ссылку на библиотечную функцию, чтобы функцию можно было реализовать , а это функция ссылки.
/usr/liblibc.so.6printf

3. Динамическая библиотека и статическая библиотека

Библиотеки функций обычно делятся на динамические и статические библиотеки. Разницу между ними можно понимать как разницу между частным и общественным. Так же, как нам нужно прочитать книгу «Си и указатели», есть два пути выбора. Один - купить книгу себе, а пользоваться ею можешь только ты. Пользоваться довольно удобно, но минус в том, что это стоит денег, второй - ходить в библиотеку брать книги, а ресурсы библиотеки общие для всех.

gccПри связывании библиотеки функций вы можете выбрать статическую или динамическую ссылку.

  1. Статическое связывание похоже на покупку книги для себя.Только для себя это стоит денег (трата памяти).При статическом связывании весь код файла библиотеки будет добавлен в исполняемый файл, поэтому сгенерированный файл будет относительно большим.
  2. Динамическое связывание похоже на поход в библиотеку за книгами. Библиотека функций размещается в фиксированном месте, и любая программа, которая хочет ее использовать, может загрузить ее сама.

LinuxgccДинамическое связывание используется по умолчанию.

Сравните размеры файлов, созданных двумя

//采用静态链接
gcc -static Test.c -o Test_static
//默认采用动态链接
gcc  Test.c -o Test

Если во время статической компоновки возникает ошибка, это может быть связано с тем, что ваша Linux статическая библиотека языка C не установлена ​​и должна быть установлена ​​вручную.

//安装C语言静态库
yum install -y glibc-static

вставьте сюда описание изображения

Видно, что исполняемый файл, сгенерированный по статической ссылке, больше, чем сгенерированный по динамической ссылке.

4. общие параметры gcc

Ниже приводится сводка общих параметров компилятора gcc.

-E активирует только предварительную обработку, это не создает файл, вам нужно перенаправить его в выходной файл;
-S компилировать на языке ассемблера без сборки и компоновки;
-c компилировать в объектный код;
-o вывод файла в файл;
-static Эта опция использует статическую компоновку для сгенерированного файла;
-g генерирует отладочную информацию. Отладчик GNU может использовать эту информацию; -shared Этот параметр
будет максимально использовать динамическую библиотеку, поэтому сгенерированный файл будет относительно небольшим, но для этого требуется, чтобы система использовала динамическую библиотеку .






Это конец этой статьи, текст кода не прост, пожалуйста, поддержите меня!

Acho que você gosta

Origin blog.csdn.net/weixin_67401157/article/details/131581525
Recomendado
Clasificación