Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Флоренсов А.Н. УП Системное программное обеспечение.docx
Скачиваний:
46
Добавлен:
28.06.2021
Размер:
148.95 Кб
Скачать

7.3. Компоновка времени загрузки с использованием GoLink

Динамическая компоновка времени загрузки перенесла момент завершения компоновки на этап загрузки программы из внешней памяти в оперативную. Предварительная компоновка в многозадачной системе формирует из одного или нескольких объектных файлов особую форму исполняемого файла для многозадачной ОС. Эта форма по своему строению похожа на обыкновенный объектный файл. Она по стандартным соглашениям в последних ОС Windows должна иметь расширение EXE и специальный заголовок (Header). Такой заголовок содержит информацию, используемую при загрузке для настройки некоторых полей машинного кода. Причем настройка выполняется так, чтобы настраиваемые поля после нее указывали действительные адреса в общем единственном экземпляре процедуры, которая размещается в оперативной памяти.

По существу при динамической компоновке времени загрузки на этапе собственно компоновки из множества объектных файлов строится объединенный объектный файл, имеющий расширение EXE и специальный заголовок. На этапе загрузки в работу включается специальный встроенный в загрузчик дополнительный компоновщик. Он в последний момент доделывает этот объединенный объектный файл до полного кода выполняемой программы. При этом универсальному загрузчику многозадачной ОС приходится, кроме собственно загрузки двоичного кода исполняемого файла и окончательной компоновки, еще и определять, находятся ли уже в оперативной памяти процедуры, которые предполагалось динамически компоновать, и если их нет в этой памяти, то загружать из внешней памяти в оперативную.

Процедуры, которые динамически подключаются (компонуются) операционной системой, предварительно собираются в специальные наборы – библиотеки динамической компоновки (DynamicLinkingLibrary, сокращенно DLL). Идея предварительного соединения объектных модулей в такую библиотеку аналогична подходу, использованному для библиотек объектных модулей. Но библиотеки динамической компоновки имеют гораздо более сложную структуру, в чем можно убедиться, собрав для примера пару процедур (вводя для них специальные дополнительные описания, как будет показано в дальнейшем изложении) в библиотеку DLL и сделав для сравнения обычную статическую библиотеку из этих же процедур.

Библиотеки DLL может создавать утилита GoLink почти так же, как она создает исполняемые файлы. Для того, чтобы компоновщику создавать исполняемый файл (с расширением EXE) или библиотеку DLL (с расширением DLL), требуются специальные указания.

Простейший формат вызова компоновщика в командной строке имеет вид

GoLink/DLL /FO имя_библ.DLL /export внеш_имя /entry точка_входа обфайлы

где результат задается именем имя_dll.DLL, в котором главное указать правильное расширение DLL, а собственное имя библиотеки выбирает разработчик. При наиболее часто встречающейся ситуации, когда библиотека должна экспортировать много внешних имен, они перечисляются после опции /exports через запятые, в частности /exportsMyFunc, MyProc, DopAbc и т. п. Часть конструкции вызова компоновщика содержит перечисление обфайлы используемых объектных файлов, причем они задаются перечислением их имен через пробелы. Библиотеки DLL и исполняемые файлы, вызывающие процедуры из таких библиотек, можно писать на любом языке программирования, небольшими дополнительными директивами, поддерживающими такую возможность.