GCC - The Complete Reference (537669), страница 70
Текст из файла (страница 70)
При использовании системных операций с плавающей точкой программы, как правило, имеют меньший размер и выполняются быстрее. Для создания библиотеки выполните команду атаке, и, затем, команду ваЬе 1пвва11, Язык сценариев компоновщика Ы Управление компоновщиком О1ЧП 1б осуществляется с помощью особых скриптов. Если сценарий отдельно не указан, то будет использоваться тот сценарий, который был встроен в 16 при его установке. Существует возможность запускать собственный сценарий, это показано в следующем примере. Здесь применяется сценарий врх1д.
11пк для компоновки выполнимого загрузочного модуля с именем врх1д: $ 1тт -Т врхгд.11пи всагс.о 1оор.о ЬквРг.о -о вРх1д Опция -т указывает имя файла сценария. Опция -с — синоним опции -т. Основной причиной использования специального сценария является схема адресации. Как правило, компоновщик (Впкег) вырабатывает выполнимый файл с настраиваемыми адресами, которые устанавливаются каждый раз при загрузке модуля Глава (7.
Встраиваемые системы 3 1 3 в память. Каждый раздел описывается двумя адресами (во многих случаях они имеют одинаковое значение): первый из них — виртуальный адрес памяти (УМА), предназначенный для внутреннего использования при запуске модуля; а второй представляет собой загружаемый адрес памяти ((.МА), указывающий расположение памяти, куда должен загружаться раздел. В случае встраиваемого модуля все ссылки разрешаются компоновшиком в абсолютные адреса, поэтому все адресные ссылки являются полностью разрешимыми и неперемешаемыми.
Описанный процесс определения адреса модуля называется его размещением ()осайпй). Некоторые системы имеют специальную утилиту, преобразуюшую вырабатываемый компоновшиком перемешаемый код в модуль с абсолютной адресацией, но компоновщик ОСС имеет собственную встроенную возможность такого преобразования. Компоновщик считывает выработанные компилятором объектные файлы и объединяет их в новый объектный файл (который также называется выполнимым файлом). Этот объектный файл имеет разделы (секции). Каждый раздел имеет имя и размер. Компоновшик объединяет разделы с одинаковыми именами в один раздел.
Некоторые из разделов содержат выполняемый код, в других находятся данные с заданными начальными значениями, в остальных содержатся неинициализированные данные. В разделе с неинициализированными данными, как правило, содержатся только имя раздела и его размер.
Пример сценария компоновщика йв 1 Следующий пример можно использовать для получения скомпонованного объектного файла. Он берет разделы из различных входных объектных файлов, объединяет их и размещает по указанным адресам: ввсттоив ( . = ОхОЬООООот .вехе ю ( "(.еехе) ) = Охаоооооот .
с)ее а: ( * ( . е)аса) ) .Ъвв : ( *(.Ьвв) ) ) Ключевое слово Ядств(з)яв указывает, что ниже приводится карта распределения памяти для скомпонованного объектного модуля. Операторы между начальной и конечной скобками команды ВВСт~О>)В предназначены для назначения расположения в памяти генерируемого кода.
Точка представляет собой специальную переменную, которая содержит текущий здрес, также называемый счетчиком адреса (!оса(юп соил(ег), для помешения данных в выходной файл. Первый оператор в приведенном примере устанавливает те- 3 1 4 Часть 111. Внутренняя структура и окружение куший адрес равным абсолютному адресу ох0100000. Если бы он не был установлен, по умолчанию использовалось бы значение О.
После установки текущего адреса он будет автоматически увеличиваться при добавлении элементов в выходной файл. Оператор . алехе(... ) помешает начало раздела . сехт выходного файла по текущему адресу. В скобках указываются элементы, которые должны включаться в раздел . Сохе выходного файла. В приведенном примере раздел . Сехв будет содержать все разделы . сехс входных файлов. Здесь можно указать конкретные имена входных файлов, звездочка "*" соответствует всем именам.
После раздела .сехс значение счетчика адресов устанавливается равным ох08000000. Это адрес раздела . «)аСа выходного файла. Объединение всех разделов . ЙаСа входных файлов в один раздел . к>ава приводит к перемещению счетчика адресов. После вставки содержимого раздела . (така счетчик адресов будет указывать на следующий за разделом . е(аса адрес, куда и помещаются данные раздела .Ьвв. Пример сценария компоновщика й' 2 Следующий сценарий компоновщика указывает расположение разделов в форме, которая, возможно, будет вами использоваться лля создания объектного файла для встраиваемых систем. В сценарии указываются адреса для ОЗУ (ВАМ) и ПЗУ (КОМ): мвмоит ( гоа (гх> : овтстн = ожоооооооо, ъвнатн зозак аа ( с> : овзатм = охоозооооо, ьвнатн ззгк ) вист*она ( .сехг гоп : ( *(.гехг> .сага гаа : ( веагеовпаеа = *(.е>ага> впктоепаеа = игом .Ъвв в ( *(.Ъвв) ) неаръосаетоп = Веас>къосаСХоп = Ог80000000 ) Этот пример начинается с ключевого слова мнмонх, которое используется для присвоения имен блокам адресного пространства выходного кода.
Этот метод может использоваться для того, чтобы разбивать адресное пространство выходного кода на отдельные блоки и с помощью дополнительных инструкций вставлять данные от- Глава 17. Встраиваемые системы 3 15 дельных разделов в конкретные блоки памяти, В приведенном примере ключевое слово мемоех применяется для задания месторасположения и размера ОЗУ и ПЗУ и присвоения им имен для дальнейшего использования. Необязательные атрибуты памяти гх означают, что содержимое памяти может считываться и выполняться.
Атрибуты гмх означают, что содержимое доступно для считывания и записи и может выполняться Если опустить атрибуты, устанавливаются все разрешения. Определенные в сценарии области памяти позволяют использовать для установки адресов имена вместо чисел. Раздел . сехк выходного файла помещается в ПЗУ, поскольку его имя и расположение определяется как . Кехг гов, а раздел .
бага по- мешается в ОЗУ, поскольку он определяется как . Вака гав. Именованные разделы помещаются в том порядке„в котором они указаны, поэтому если адрес не указан, следующий раздел располагается после предыдущего. Например, раздел . ьва будет находиться непосредственно после раздела . с)ака. Такие символы, как яеагеОкпаеа и епг)окраса, включенные в сценарий, в процессе компоновки становятся глобальными переменными. Эти имена могут использоваться в программе для получения непосредственного доступа из программы к тому разделу памяти, в котором они установлены. Символ неарьосакзоп определен как адрес в ОЗУ, следующий непосредственно после раздела . ьвв, а для символа Вкас)къосактоп установлен абсолютный адрес Ох80000000. Некоторые другие команды сценариев компоновщика Ы Команда остин Ровм)кт очень важна для получения выходного выполняемого модуля в такой форме, которая позволяет загружать его в вашей системе.
Например, следующая команда сформирует выходной объект в шестнадцатеричном формате процессора 1п<е1; ОПТРПТ РОВМАТ<ГТЬех") Для этой команды доступны и описатели двоичных файлов (ВНЭ), в частности "Ьтпагу", "ТЬех" (для шестнадцатеричного формата )п<е!), "вгес" (для Б-записей), "еокк-аь" (для ЯН-2) и "сог1-вов)к" (для СР(332) (и это не полный список).
Использование в сценарии команды ОПТРПТ Р<звм)кт аналогично использованию команды --огогвак командной строки комгюновшика, которая имеет тот же набор возможных описателей двоичных файлов. Команду т)яРВТ можно использовать для указания списка библиотек и/или объектных файлов, которые вы хотите включить в каждую ссылку. Например, в следующем примере в ссылки будут включаться две библиотеки и один объектный файл: тнвцт<зкье.а зкьд.а веагевое<.о) С помощью команды ОптРпт Р?ьенвме можно указать имя выходного файла, как зто показано в следующем примере: Оцтвпт Ртьяидия<ттоае)аъъе.оцк"); ава Выкв~ квмпиишра о сновное назначение компилятора заключается в выработке объектных файлов, библиотек, содержагцих объектные файл ы, и выполняемых программ. Кроме того, компилятор можно использовать для получения других выходных результатов. Хотя это требуется и очень редко, тем не менее, компилятор может оказаться полезным в ситуациях, когда бывает трулно найти выход из возникшей проблемы.
Имеются опции, позволяющие определить "мнение" компилятора о синтаксисе программы, узнать, где он осушествляет поиск подпроцессов и библиотек, и получить листинг промежуточного кода, выработанный в результате обработки вашей программы. У вас есть возможность просмотреть полный список всех заголовочных файлов, включаемых в программу, и автоматически на основании исходного кода сформировать зависимости для компоновочного файла. Сведения о программе Компилятор формирует подробные внутренние таблицы, содержашие данные о компилируемой программе.
Существуют доступные опции командной строки, которые позволяют считать часть этих данных. У вас есть возможность не только изучить дерево синтаксического разделения, содержашее внутреннее представление вашего кода, но и получить полный список всех включаемых заголовочных файлов, узнать время компиляции и объем памяти, занимаемый каждым модулем программы. Для программ, написанных на языке С++, можно, кроме того, получить взаимоотношения определений классов. Дерево синтаксического разбора Компилятор выполняет синтаксический разбор программы (рагз1пй), преобразовывая ее во внутреннюю древовидную структуру.