Тип связывания или тип компоновки
Как правило, связывание осуществляется в два прохода. Первый проход определяет размер каждого модуля и их объединения и создает таблицу имен. Таблица имен связывает каждый символ (например, имя переменной) с адресом, что позволяет компоновщику выполнить разрешение ссылок. На втором проходе компоновщик присваивает адреса блокам данных и команд, а также выполняет разрешение внешних ссылок на символы. Компоновщики также выполняют разрешение внешних ссылок (symbol resolution), при котором внешние ссылки одного модуля привязываются к соответствующим внешним именам другого модуля.
Момент выполнения компоновки программы зависит от среды. Программа может быть скомпонована во время компиляции, если программист обладает всем необходимым кодом в исходном файле, для того чтобы разрешить все ссылки на внешние имена. При этом выполняется поиск в исходном коде всех внешних ссылок и размещения соответствующих внешних символов в итоговом объектном файле. Как правило, этот метод не позволяет получить полноценный результат, поскольку многие программы полагаются на совместно используемые библиотеки (shared library), содержащие совокупность функций, которые могут быть совместно использованы различными процессами. Многие программы могут ссылаться на одни и те же функции (такие как функции библиотеки, которые управляют входными и выходными потоками), не включая их в свой объектный код. Как правило, этот тип связывания осуществляется после компиляции, но перед загрузкой. Связывание также может происходить во время выполнения программы - процесс, называемый динамическим связыванием (dynamic linking). В этом случае разрешение ссылок на внешние функции не выполняется, пока процесс не загрузится в память или не выдаст запрос функции. Это полезно для больших программ, использующих программы сторонних разработчиков, так как при таком подходе нет необходимости перекомпоновывать динамически связанную программу, когда используемая ей библиотека модифицируется. Более того, так как динамически связанные программы не связываются, пока не будут загружены в память, код совместно используемой библиотеки может храниться отдельно от кода других программ. Динамическое связывание также позволяет экономить место на вторичных запоминающих устройствах, поскольку только одна копия совместно используемой библиотеки хранится для любого количества использующих ее программ.
Тип связывания или тип компоновки определяет соответствие имени объекту или функции в программе, исходный текст которой располагается в нескольких модулях. Различают статическое и динамическое связывание.
Статическое связывание бывает внешним или внутренним. Оно обеспечивается на стадии формирования исполнительного модуля, ещё до этапа выполнения программы. Если объект локализован в одном модуле, то используется внутреннее связывание. Тип компоновки специальным образом не обозначается, а определяется компилятором по контексту, местоположению объявлений и использованию спецификаторов класса памяти. Внешнее связывание выполняется компоновщиком, который на этапе сборки многомодульной программы устанавливает связь между уникальным объектом и обращениями к объекту из разных модулей программы.
При динамическом связывании компоновщик не имеют никакого представления о том, какой конкретно объект будет соответствовать данному обращению. Динамическое связывание обеспечивается транслятором в результате подстановки специального кода, который выполняется непосредственно в ходе выполнения программы.
Дата добавления: 2015-09-07; просмотров: 1829;