- •Системное программное обеспечение
- •Isbn 978-5-8149-2441-4
- •Введение
- •1. Основы программирования на ассемблере
- •1.1. Принципы построения ассемблерных программ
- •1.2. Понятие архитектуры компьютера
- •1.3. Регистры программиста в ia32
- •1.4. Описание сегментной структуры программы
- •2. Простейшие средства ассемблера
- •2.1. Средства описания данных
- •2.2. Обращения к функциям операционной системы посредством прерываний
- •2.3. Средства преобразования в исполняемый файл
- •2.4. Управление строками при выводе и вводе данных
- •2.5. Простейшие способы адресации
- •3. Архитектурные элементы для построения программ
- •3.1. Организация условных переходов
- •Команды условных переходов
- •3.2. Средства организации циклов
- •3.3. Особенности команд умножения и деления
- •3.4. Организация процедур
- •3.5. Неарифметические операции над кодами
- •3.6. Архитектура amd64 процессоров в ассемблерных Linux программах
- •4. Использование неэлементарных способов адресации
- •4.1. Косвенно-регистровая адресация и ее использование
- •4.2. Использование индексной адресации данных
- •4.3. Базовая и индексно-базовая адресации
- •5. Взаимодействие программных компонентов
- •5.1. Многомодульная разработка программ
- •5.2. Организация стекового кадра подпрограммы
- •5.3. Программный доступ к системным функциям Win32
- •5.4. Использование свободно распространяемых утилит для Win32
- •5.5. Вызов функций из стандартных библиотек Linux
- •6. Библиотеки объектных модулей
- •6.1. Использование библиотек объектных модулей в Linux
- •6.2. Использование библиотек объектных модулей в Win32
- •7. Разделяемые библиотеки выполняемых программ
- •7.1. Понятие о статической и динамической компоновке
- •7.2. Конструкция библиотеки динамической компоновки
- •7.3. Компоновка времени загрузки с использованием GoLink
- •Контрольные вопросы
- •Заключение
- •Библиографический список
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 и исполняемые файлы, вызывающие процедуры из таких библиотек, можно писать на любом языке программирования, небольшими дополнительными директивами, поддерживающими такую возможность.