Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО юнита 2.doc
Скачиваний:
38
Добавлен:
17.11.2019
Размер:
5.82 Mб
Скачать

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).