GCC - The Complete Reference (537669), страница 34
Текст из файла (страница 34)
Следующая команда доз использует опцию -с для создания файла не11оьгог1б. с1евв из исходного файла Не11оиог1й.ЗЕче: ь дсб -С -Иа11 Не11оног16.3еча В сочетании с -с опция -о недоступна, так что выходной файл .с1авв всегда будет иметь то же имя, что н входной файл . з аче. Класс не11оиог1б содержит необходимый методрцЫдс всае1с чоЫ ве1п(), это значит, что он может быть запущен на выполнение в среде виртуальной машины лага проекта Сз)ч'с) д11 из командной строки: Э д1з не11оиогза Вырабатываемый командой дс5 5ача-класс совместим с другими интерпретаторами /ага.
Ту же программу можно запустить в виртуальной машине лича, поставляемой корпорацией Яцп М1сгозуз)ешж $ Зача Не11оног1С Двоичный объектный файл из отдельного исходного файла на языке Зача Предлагаемый далее пример команды использует опцию -с для подавления компоновки и выработки объектного файла. Такой объектный файл не только можно скомпоновать в исполняемую программу, но также и сохранить в составе статической библиотеки для последующей компоновки.
ь дсэ -с Не11оног1с.эача Ло этой команде будет создан объектный файл не11оног1б. о, При необходимости можно назначить другое имя для выходного объектного файла, используя опцию -о; ь доз -с Не11оног16.зача -о ье11о.о Для компоновки объектного файла в машинную программу можно использовать все ту же команду до З. Файл Ье11о. о в объектном коде содержит определение класса Глава 8. компиляция программ иа языке дача 1 55 де11оног1б со статическим методом ша1п().
Поэтому имя класса должно быть указано в команде в качестве точки входа в программу: д де~ --ва1п=не11оисг1с йе11с.с -о Ье11о Необходимость подобного изменения имен объектных файлов возникает крайне редко. Мы построили этот пример так, чтобы нагляднее показать, что в опции — ва1п должно указываться имя класса, а не файла.
Преобразование байт-кода интерпретатора 1ача в машинную программу Можно использовать де б для компиляции байт-кода Л'М в самостоятельную выполняемую машиной программу. Указываемый в командной строке файл с суффиксом имени . с1ава при компиляции в машинный код воспринимается доз так же, шк и исходный файл с расширением .
зача. В следующем примере первая команда хеипилирует исходный файл в файл )ача-класса, а вторая команда компилирует файл гласса в самостоятельный исполняемый файл: 3 дс5 -С Ие11оног1с.дача 3 дс5 ие11оисг1с.с1аав -о ие11оисг16 Компиляция нескольких исходных файлов 3ача в запускаемую программу Для того, чтобы создать самостоятельный файл готовой к выполнению машинной программы из набора исходных файлов, следует скомпилировать каждый исходный файл и затем скомпоновать полученные объектные модули, указав компоновщику тот из них, который содержит метод ша1п(). Следующий простой пример содержит главную процедуру, использующую другой класс для построения строки и еще один класс для вывода этой строки.
Вот класс дауие11о, содержащий главную процедуру: /* Вауие11о.дача */ риъ1[с с1авв Вауне11о ( раЬ11с веае1с чо[с ва[п(аег1пд агд[)) юсгссас сас = пеи исгссас()г саС.асс("Не11с"]г сае.асс("сгпе1")г сае.асс("иог1с")/ вау вау = пеи вау(сас.совсгдпд()); вау.вреа)с(); ) ) МЕтОд абб ( ) КЛаССа ВГОгбеаС ПрИНИМаЕт СЛОВО И дОбаВЛяЕт ЕГО К КОНцу СтрОКИ, хеторая содержится во внутренней переменной. Метод содсг1пд( ) класса вгогс)сас возвращает строку-результат.
Эта строка передается методу вреак ( ) объекта клас- 1 56 Часть!!. Использование Сборного Компилятора са зау, который и выводит ее на дисплей. Далее приводится класс етогйсае, который добавляет к внутренней строке по одному слову при каждом вызове его метода айй(): /" ИогйСае */ риЬ11с с1авв Иогйсаг ( рг(чаев Ясггпд вег1пд = ""т риЬ1(с чоьй айй(ясг1пд пениогй) ( (Е(всгапд.1епдЕЬ() > О) вегьпд += " "т вег1пд += пендогйт ) риЬ1(с Зсг(пд Еояеггпд() ( гесигп(всг1пд)т ) ) Клаас Яау содержит внутреннюю строку буквенных символов и метод вреа)с ( ), используемый для вывода этой строки: /* Заз .5ача */ риЬ11с с1авв Зау ( рг1часв ясг1пд всг1пдт яау(ясг1пд всг) ( всг1пд = вегт ) риЬ11с чоай вреак() ( Яувсеп.оис.рг1пс1п(всг1пд)т ) ) Все три класса мокнут быть скомпилированы в выполнимый файл несколькими путями. Наиболее прямой способ состоит в том, чтобы сделать все одной командой: 3 доз --па1п=зауне11о зау.зача зауне11о.зача иогйсае.зача -о яауне11о По этой команде все три исходных файла будут скомпилированы в объектные, которь)е затем будут скомпонованы в один двоичный файл с именем яауяе11о.
Причем метод таа1п () класса яауне11о будет установлен в качестве точки входа в программу. Того же результата можно достичь выполнением последовательности команд для компиляции кажлого исходного файла в объектный и последующей их компоновки с указанием точки входа в программу: Я дсЗ -с ЯауНе11о.Зача 3 доз -с яау.чача Ф доз -с Иогйоас.эача Я дсэ --ва(п=яауне11о Зау.о ЯауНе11о.о Иогйсае.о -о ЯауНе11о Также возможно вначале странслировать исходный код программы в классы интерпретатора Л'М, и уж потом скомпилировать те же объектные модули из файлов классов. Затем скомпоновать двоичный файл из полученных объектных модулей с указанием головной процедуры в качестве точки входа в программу.
Глава 8. Компиляция программ на языке дача 1 57 Компиляция нескольких входных файлов интерпретатора 3ЧМ в машинный код Примеры исходных файлов предыдущего раздела могут быть скомпилированы в (ря файла классов интерпретатора Уача: Я де5 -с зауне11о. зача зау. 5ача иогйсае. зача Результатом выполнения этой команды будет набор файлов классов, который иежет быть запущен на выполнение в вартуальной машине 3ача.
Вот вариант команды )екего запуска нашей программы: 3 Зачв ЗауНе11о Скомпилировать все исходные файлы на языке Уача текущего каталога в классы интерпретатора можно и такой командой: Я дс3 -С *.5ача При компиляции и компоновке в двоичный код файлы классов на байт-коде Л'М метут восприниматься компилятором в качестве исходных. Далее приводятся две команды: первая транслирует исходные файлы в классы интерпретатора, а вторая кеилилирует эти классы в двоичную исполнимую программу с именем Зауие11о: 3 доз -с зауне11о. зача Зау. ~аче иогйСае.~ача Е де3 — ва(п=зауне11о зау.с1авв иогйсае.с1авв зауне11о.с1ввв -озаунв11о Команда доз определяет тип входного файла по суффиксу его имени.
Благодаря згому существует возможность смешивать входные файлы различных типов. Про(рвана дс5 способна компилировать и компоновать программы из комбинации исжх(вмх файлов, классов Л'М и файлов в объектном коде, что демонстрирует следувл(ий набор команд: Я доз -с зауне11о. заче -о зауне11о.
о Я де5 -С Иогйсас.эача Я де) --ва1п=аауне11о ЗауНе11о.о Зау.~ача Иогйсас.е1авв -о Звуие11о Выработка ассемблерного кода Приведенный далее класс при выполнении создает экземпляр самого себя и, испсльзуя метод вреа)г ( ), выдает строки на стандартное устройство вывода: /» дав»и. зача */ риЬ11е е1авв Юавп ( риЬ11с всаи1с чо1й ма(п(всг(пд агд()) ( юавп 5вп = пе»» аавп()г Звм.вреаи()( ) риЬ1(с чо1й вреах() ( Зувсеп.оис.рг1пс1п("аавт вреахв"]; ) ) 1 58 Честь и.
Использование Сборного Компилятора Этот класс представляет собой вполне законченное приложение. Он может быть скомпилирован в ассемблерный язык соответствующей целевой платформы следующей командой: Ф дсб -в давп.за га На выходе мы получим файл с ассемблерным кодом банга. в, который можно использовать для создания исполнимого двоичного файла.
Для той же цели в качестве входного может быть использован и файл класса Хата с байт-кодом интерпретатора Л'М. Первая из приведенных далее команд создает файл класса дава. с1авв из исходного Юввгв. звча, вторая — использует этот файл. с1авв лля генерирования программы на ассемблере давгв. в: Ф дсб -с давп.зача Ф дсб -8 даем.с1авв Создание статической библиотеки Статической библиотекой называется набор объектных файлов (с суффиксом .о), сохраняемых внутри одного файла, называемого слгатической библиотекой илн архивохг.
Компоновка программы с модулем библиотеки ничем не отличается от ее компоновки с отдельным объектным файлом. Используя ранее приведенные в этой главе примеры программ на языке lача, создадим объектные файлы тгокйсвс о и вау. о лля последующего их сохранения в статической библиотеке: Е де~ -с иохдсас.~ача вау.зача Для построения и обслуживания статических библиотек применяется утилита ат.
Для создания библиотеки из перечисленных в команде объектных файлов используется опция -к. В случае, когда указана уже существующая библиотека, новые модули добавляются в нее, а существующие заменяются при совпадении имен более свежими их версиями. Следующая команда создает библиотеку 11Ьвау.а из двух объектных файлов; в ак -т 11ьвау.а иокцсае.о аау.о Для использования объектных модулей библиотеки достаточно в командной стро- КЕ дед уКаэатЬ ИМя бнбЛОтЕКИ. СЛЕдуЮщая КОМаНда ИСПОЛЬЗуЕт бИбЛИОтЕКу 11ЬВау. в при создании готовой к запуску машинной программы 11ЬЬе11о: 3 доз --па1п=вауне11о вауне11о.амачи 11ьеау.а -о 11ьье11о Такое указание в командной строке имени библиотеки предполагает ее наличие в текущем каталоге.
Если библиотека находится в расположении, разрешимом для поиска библиотек командой доз, то для указания ее имени можно использовать опцию -1, как это показывает следующий пример команды: Ф дсб --паьп=аауНе11о Вауне11о.эачв -1вау -с 11ЬЬе11о Подробнее о расположении библиотек читайте в главе 12. Глава 8. Компиляция программ на языке дача 1 59 Создание разделяемой (динамической) библиотеки Разделяемая библиотека — это коллекция объектных файлов, хранимая внутри отдельного файла. Это примерно то же самое, что и статическая библиотека, только она имеетдва существенных отличиями.
Во-первых, объектные файлы в составе разделяемой (иначе называемой динамической) библиотеки подгружаются и компонуются к программе во время ее выполнения. Во-вторых, эти объектные файлы должны быть скомпилированы особым образом — так, чтобы их код мог выполняться без кодификации независимо от места его загрузки. Для создания пригодных для размещения в динамической библиотеке объектных файлов их следует компилировать сопдией -йр1с для выработки позиционно-независимога кода (гРогдбоп!пдерепдепт Соде" ). При этом для разрешения всех внутренних ссылок и вызовов используется относительная адресация, учитывающая возможность многократной выгрузки и загрузки кола во время выполнения программы.
В разделе будет рассматриваться пример, используюшиий ранее приведенные в этой главе исходные файлы. Следующая команда создает объектные файлы перемевпемого формата: 3 деэ -ЙР1о -с Иогйоав.дача Зау.эача Для компоновки объектных файлов в новую разделяемую библиотеку 11Ьвау. во хспользуется команда дед с опцией -вЬагвй; 3 доз -вцагей иогйсае.о вау.о -о 11Ьвау.во Теперь исходный файл вауНе11о. дача можно скомпилиРовать в машиннУю программу вЬ11ЬЬа11о, которая при выполнении использует объектные модули из разделяемой библиотеки 11Ьвау.