Компиляция и make (1110642)
Текст из файла
План семинара1. Понятие единицы трансляции, области видимости.1. Идентификатор как имя объекта (переменной) или функции.2. Область видимости имени: файл, блок (составной оператор), функция, прототипфункции. Начало и конец области видимости.3. Единица трансляции — один файл с исходным текстом (Си или Ассемблер).2. Понятие связывания.1. Связывание имён: внешнее связывание — имя доступно в нескольких единицах трансляции; внутреннее связывание — имя доступно только в своей единицетрансляции; без связывания — для имён, не описывающих объекты (переменные) илифункции, например, теги структур, параметры функций, блочныепеременные без ключевого слова extern.2. Связывание по умолчанию для переменных (кроме блочных) и функций в Си —внешнее.
Можно использовать ключевое слово global, чтобы дополнительноподчеркнуть способ связывания. Для внутреннего связывания используетсяключевое слово static.3. В Ассемблере локальные и нелокальные метки соответствуют внутреннемусвязыванию, а глобальные (с директивой GLOBAL) — внешнему. Для объявленияиспользования внешнего имени используется директива EXTERN.4.
Пример 26-1: внешнее связывание функций в языке Си.5. Пример 26-2: внешнее связывание функций в языке Ассемблера.6. Можно использовать в единице трансляции на Ассемблере внешние имена изединицы трансляции на Си и наоборот.3. Понятие объектного модуля. Процесс сборки программы.1. Процесс сборки программы: препроцессирование — подстановка текстов заголовочных файлов(директива #include), условная трансляция, макроподстановки; компиляция — получение из каждой единицы трансляции кода намашинном языке (Ассемблера) и генерация объектного модуля смашинным кодом; линковка — объединение объектных модулей вместе с библиотеками висполняемый файл.2.
Объектный модуль — представленные в машинном виде объекты и функции,содержащиеся в единице трансляции, вместе с таблицей имён. В таблицу имёнпопадают только те объекты и функции, которые имеют внешнее связывание.3. Разрешение связей во время линковки: проверяется, что для каждого заявленноговнешнего имени есть ровно одно определение в данном наборе объектныхмодулей. Невыполнение этого правила приводит к ошибке линковки.4. Препроцессирование и компилияция, как правило, происходят одновременно.Линковка является отдельным этапом для многомодульных программ.
В случаеодномодульной программы линковка может быть выполнена одновременно спервыми двумя этапами.5. Пример 26-3: компиляция и линковка Си-программы.6. Пример 26-4: компиляция и линковка Ассемблерной программы.7. При использовании GCC для линковки, если не указано обратное, будетподключаться стандартная библиотека языка Си. Выполнение будет начинаться сфункции main с учётом следующего замечания.8. Замечание для платформы Windows: все внешние имена на данной платформе прииспользовании cdecl снабжаются ведущим подчёркиванием (то есть main4.5.6.7.превращается в _main).
Компилятор языка Си делает это автоматически, а вот вАссемблере это необходимо делать вручную. Макросы из библиотеки io.incпозволяли раньше не думать об этом: конструкция CEXTERN имя на платформах UNIX преобразовывалась вEXTERN имя, а на платформе Windows — в EXTERN _имя; конструкция CMAIN, аналогично, преобразовалась либо в main, либо в_main.Понятие библиотеки как совокупности объектных модулей. Подключение библиотек.1. Библиотека имеет имя, по которому её можно подключить.2. Линковщик, входящий в состав GCC, если не указано обратное, подключаетстандартную библиотеку языка Си libc.3. Математическая библиотека языка Си называется libm.4.
Пример 26-5: линковка с использованием библиотек.Задачи 26-1, 26-2.Заголовочные файлы.1. В Си-программах необходимо для каждого внешнего имени обеспечить егообъявление. Поскольку таких внешних имён может быть много, чтобы невписывать их объявления вручную в каждую единицу трансляции (файлы .c),используются заголовочные файлы с расширением .h.2. Препроцессор, встречая директиву #include, подставляет текст заголовочногофайла полностью в данный файл.3. Системные заголовочные файлы должны использовать угловые скобки, алокальные файлы — двойные кавычки.4.
Разница между подключением заголовка и линковки с библиотекой: в первомслучае получаем только объявления, но не сами объекты. Во втором — наоборот.Итого: необходимо делать и то, и другое.5. Пример 26-6: использование заголовочных файлов.Задача 26-3.ПримерыПример 26-1Внешнее связывание функций в языке СиФайл file1.c:extern intfib(int);static intfib5(void){return fib(5);}Файл file2.c:intfib(int n){return n > 2 ? fib(n - 1) + fib(n - 2) : 1;}Пример 26-2Внешнее связывание функций в языке ассемблераФайл file1.asm:EXTERN fibfib5:PUSHMOVEBPEBP, ESPSUBESP, 8MOVCALLDWORD [ESP], 5fibLEAVERETФайл file2.asm:GLOBAL fibfib:PUSHMOVEBPEBP, ESPSUBESP, 8MOVCMPJGEAX, DWORD PTR [EBP + 8]EAX, 2.1MOVJMPEAX, 1.2MOVDECCALLDWORD PTR [ESP], EAXDWORD PTR [ESP]fibMOVDECCALLDWORD PTR [ESP + 4], EAXDWORD PTR [ESP]fibADDEAX, DWORD PTR [ESP + 4].1:.2:LEAVERETПример 26-3Компиляция и линковка Си-программы.Команда для компиляции Си-модуля с использованием GCC:gcc [ дополнительные-опции ] -c -o объектный-модуль.o единица-трансляции.cКлюч -с: компилировать или ассемблировать исходные файлы, но не линковать.
Стадиялинковки просто не выполняется. Конечный вывод происходит в форме объектного файла длякаждого исходного файла. По умолчанию, имя объектного файла делается из имени исходногофайла заменой суффикса '.c', '.i', '.s', и.т.д. на '.o'.Ключ -o файл: поместить вывод в файл 'файл'. Эта опция применяется вне зависимости от видапорождаемого файла, есть ли это выполнимый файл, объектный файл, ассемблерный файл илипрепроцессированный C код.Команда для линковки нескольких модулей с использованием GCC:gcc [ дополнительные-опции ] -o исполнимый-файл объектные-модули...Традиционно на UNIX-системах расширение для объектного модуля — “.o”, а исполнимыефайлы не имеют расширения.Пример сборки программы из двух модулей:gcc -std=c99 -c -o file1.o file1.cgcc -std=c99 -c -o file2.o file2.cgcc -o program file1.o file2.oисполнимый файл program; компиляция первого модуля, получаем file1.o; компиляция второго модуля, получаем file2.o; линковка file1.o и file2.o, получаемПример 26-4Компиляция и линковка ассемблерной программы.Команда для компиляции Ассемблерного модуля с использованием NASM:nasm [ дополнительные-опции ] -f elf32 -o объектный-модуль.o единица-трансляции.asm; на UNIX-системахnasm [ дополнительные-опции ] -f win32 -o объектный-модуль.o единица-трансляции.asm; на WindowsЛинковка может быть осуществлена с использованием GCC так же, как и в примере 26-3.Пример сборки программы из двух модулей на UNIX:nasm -f elf32 -o file1.o file1.asmfile1.onasm -f elf32 -o file2.o file2.asmfile2.ogcc -o program file1.o file2.oисполнимый файл program; компиляция первого модуля, получаем; компиляция второго модуля, получаем; линковка file1.o и file2.o, получаемПример 26-5Для линковки с дополнительными библиотеками используются опции -l и -L.
Опция -lиспользуется для указания имени библиотеки, с которой будет производиться линковка. Приэтом префикс lib отбрасывается.Пример линковки с библиотекой libm:gcc -lm -o program file1.o file2.oЕсли библиотека расположена в нестандартном месте (стандартное место зависит отплатформы), то необходимо указать путь к ней опцией -L.Пример линковки с указанием пути к библиотекам:gcc -L/usr/local/lib -lm -o program file1.o file2.oПример 26-6Вынесем объявление функции fib() из примеров 1 и 2 в отдельный заголовочный файл.Файл fib.h с объявлением:intfib(int number);Файл main.c с использованием функции fib():#include <stdio.h>#include "fib.h"intmain(void){printf("fib(5) = %d\n", fib(5));return 0;}Файл fib.c с реализацией функции fib():#include "fib.h"intfib(int number){return number > 2 ? fib(number - 1) + fib(number - 2) : 1;}Вопросы к примеру:1.
Зачем в файле fib.c подключается заголовок?2. Можно ли пометить функцию fib как extern? Как static?3. Какие команды для сборки необходимо использовать?Комментарий: может понадобиться добавить к команде компиляции ключ -I. для того, чтобыкомпилятор нашёл локальный заголовочный файл.ЗадачиЗадача 26-1Программа quux состоит из одного Си-модуля в файле foo.c и одного Ассемблерного модуля вфайле bar.asm.
Выписать команды для сборки этой программы. Программа должна бытьслинкована с математической библиотекой языка Си.Решение:gcc -std=c99 -c -o foo.o foo.cnasm -f elf32 -o bar.o bar.asmgcc -lm -o quux foo.o bar.oЗадача 26-2Написать на языке Ассемблера программу, вводящую два целых 32-разрядных числа, ивыводящая максимальное из них. Запрещается использовать библиотеку макросов io.inc.Считать, что программа будет работать в UNIX-окружении. Выписать команды для сборкипрограммы.Программа в файле max.asm:SECTION .rodatafmtSfmtPDB "%d%d", 0DB "%d", 10, 0SECTION .textEXTERN scanfEXTERN printfGLOBAL mainmain:LEAECX, [ESP + 4]ANDESP, -16PUSHDWORD [ECX - 8]; выравниваем стекPUSHMOVEBPEBP, ESP; создаём фреймPUSHSUBECXESP, 20; сохраняем ECX; резервируем два параграфа по 16 байтовMOVLEAMOVLEAMOVDWORD [ESP], fmtSEAX, [ESP + 12]DWORD [ESP + 4], EAXEAX, [ESP + 16]DWORD [ESP + 8], EAX; готовим параметры для scanf(); локальная переменнаяCALLscanfMOVCMPCMOVLEAX, DWORD [ESP + 16]EAX, DWORD [ESP + 12]EAX, DWORD [ESP + 12]; вычисляем максимумMOVMOVDWORD [ESP], fmtPDWORD [ESP + 4], EAX; готовим параметры для printf()CALLprintfADDPOPLEAESP, 20ECXESP, [ECX - 4]; восстанавливаем стекXORRETEAX, EAX; возвращаем 0; локальная переменнаяКоманды для сборки:nasm -f elf32 -o max.o max.asmgcc -o max max.oДополнительные вопросы:1.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.