![](/user_photo/2706_HbeT2.jpg)
- •Гуманитарная Академия Дистанционное образование
- •Оглавление
- •Дидактический план
- •Литература
- •Перечень компетенций
- •Тематический обзор
- •1 Понятие системы программирования
- •1.1 Классификация систем программирования
- •1.2 Средства автоматизированной разработки программ
- •1.3 Пакеты прикладных программ
- •1.4 Объектно-ориентированные системы программирования
- •2 Основные концепции трансляторов
- •2.1 Введение в методы трансляции
- •2.2 Разновидности языкового процессора
- •2.3 Компиляторы как класс программного обеспечения
- •2.4 Среда разработки компилятора
- •2.5 Упрощенная модель компилятора
- •2.6 Лексический анализ
- •2.7 Синтаксический анализ
- •2.8 Семантический анализ
- •2.9 Конечный автомат
- •2.10 Контексно-свободная грамматика
- •2.11 Атрибутные транслирующие грамматики
- •2.12 Генерация кода
- •2.13 Распределение памяти
- •3 Редактор связей
- •3.1 Управляющий язык редактора связей
- •3.2 Предложения определения секций
- •3.3 Спецификации файлов
- •3.4 Выходная секция
- •3.5 Создание и определение имен при редактировании связей
- •3.6 Размещение секций в именованных областях памяти
- •3.7 Инициализация пустот и секций .Bss
- •3.8 Определение точки входа
- •3.9 Библиотеки объектных файлов
- •3.10 Алгоритм размещения
- •3.11 Инкрементальное редактирование связей
- •3.12 Синтаксис управляющего языка редактора связей
- •4 Отладчик
- •4.1 Отладчик Turbo Debugger
- •4.2 Отладчик Турбо Паскаль
- •4.3 Отладка программ в системе Delphi 7
- •Задания для самостоятельной работы
- •Тренинг компетенций
- •Глоссарий
- •Системное программное обеспечение (курс 1) юнита 2
3.10 Алгоритм размещения
Выходная секция создается в результате выполнения предложения SECTIONS, объединения одноименных входных секций или объединения секций .text и .init в выходную секцию .text. В вы-ходную секцию включаются несколько входных. После того, как состав выходной секции опреде-лен, ей назначается для размещения участок конфигурируемой виртуальной памяти. ld(1) исполь-зует алгоритм, цель которого – минимизировать фрагментацию памяти и таким образом повысить вероятность успешного размещения всех выходных секций, с учетом конфигурации памяти:
– размещаются все выходные секции, связанные с конкретными адресами;
– размещаются все секции, связанные с именованными областями памяти. Секции, размещае-мые на этом или следующем шаге, связываются с первым доступным в памяти адресом, с учетом требований выравнивания, если таковое имеются;
– размещаются все остальные выходные секции.
Если, как это предполагается по умолчанию, вся память образует одну непрерывную конфигурируемую область, а предложения SECTIONS отсутствуют, то выходные секции размещаются в том порядке, в котором их создает ld(1). В остальных случаях выходные секции размещаются в том порядке, в котором они определяются, или становятся известными ld(1), – в первой подходящей из доступных областей памяти.
3.11 Инкрементальное редактирование связей
Результат работы ld(1) можно использовать в качестве исходной информации для последующего редактирования связей, при условии, что сохраняется информация о настройке ссылок – задана опция -r. Редактирование связей, использующее ранее полученную информацию, называется инкрементальным. Есть смысл разделять большие системы на несколько подсистем, связи внутри которых редактируются независимо, а затем, при необходимости, осуществлять пересборку системы в целом.
Если подсистемы формируются разумно, то после перекомпиляции нескольких файлов придется повторить лишь часть процесса редактирования связей. Рекомендуется придерживаться двух правил:
– промежуточные вызовы редактора связей должны управлять только построением выходных секций из входных файлов и их секций, но не назначать адреса этим секциям;
– операторы присваивания и предложения, управляющие размещением секций и конфигура-цией памяти, следует включать только в окончательный вызов ld(1).
Секции DSECT, COPY, INFO и OVERLAY
При определении секций им может быть назначен тип.
Применение опции DSECT приводит к созданию так называемой фиктивной секции. Свойства фиктивной секции:
– не размещается, то есть не принимается во внимание при распределении памяти для выходных секций, поэтому не занимает памяти и не фигурирует в карте распределения памяти, которую выдает ld(1);
– может перекрываться с другими выходными секциями, включая фиктивные, и даже с неконфигурируемыми областями памяти;
– глобальные имена, определенные в фиктивной секции, перемещаются обычным образом. В таблице имен выходного файла они имеют то же значение, которое имели бы, будь DSECT-секция действительно загружена по назначенному ей виртуальному адресу. Если в DSECT-секции найдены неопределенные внешние имена, то просматриваются библиотеки объектных файлов, чтобы найти элементы, где эти имена определяются. Связи найденных объектных файлов редактируются обычным образом, то есть не как фиктивные секции;
– в выходной файл не включается ни содержимое фиктивной секции, ни ассоциированная с ней информация о настройке ссылок и номерах строк.
Секция с опцией COPY подобна фиктивной секции с той лишь разницей, что данные COPY-секции и вся связанная с ней информация включаются в выходной файл.
Те же свойства, что и COPY, имеют INFO-секции, однако назначение последних – хранить информацию о самом объектном файле, в то время как секции COPY могут содержать действительные данные или команды.
Секция типа NOLOAD отличается от обычной выходной секции: содержащиеся в ней команды и/или данные не включаются в выходной файл. Под NOLOAD-секцию отводится виртуальная память, которая фигурирует в карте распределения памяти.
Секция типа OVERLAY настраивается и записывается в выходной файл. От обычной секции она отличается тем, что не размещается и может перекрываться с другими секциями и неконфигурируемыми областями памяти.
Выравнивание секций в выходном файле
Для выравнивания секций внутри выходного файла используется опция BLOCK, которую можно указывать как для отдельной секции, так и в предложении GROUP. Опция BLOCK не влияет ни на процесс редактирования связей, ни на адрес размещения выходной секции и отражается только на расположении секции в пределах выходного файла. Пример:
SECTIONS {
.text BLOCK (0x200): {}
.data ALIGN (0x2000) BLOCK (0x200): {}
}
Указанные предложения SECTIONS предписывают ld(1), чтобы каждая из секций .text и .data оказались в выходном файле со смещением от начала, кратным 0x200 – например, 0x0, 0x200, 0x400 и т.д.
Ненастраиваемые входные файлы
Если результат работы ld(1) предполагается использовать в качестве исходных данных для последующего редактирования связей, необходимо при первом вызове ld(1) указать опцию -r, чтобы сохранить информацию о настройке ссылок и дать возможность выполнить окончательное редактирование.
Если во входном файле ld(1) отсутствует таблица имен или информация о настройке ссылок, ld(1) продолжает работу, используя в качестве исходных данных ненастраиваемый файл.
Для того, чтобы такое редактирование связей завершилось успешно, применительно к ненастраиваемым файлам должны выполняться два условия:
– ни в одном входном файле не должно быть неразрешенных внешних ссылок;
– каждый входной файл должен быть связан с тем же адресом, что и при первом вызове ld(1).