Компоновщик
Компоновщик (также редактор связей, от англ. link editor, linker) — инструментальная программа, которая производит компоновку («линковку»): принимает на вход один или несколько объектных модулей и собирает из них исполняемый или библиотечный файл-модуль.
Изначально, до появления динамических библиотек, загрузчики могли выполнять некоторые функции компоновщика[1], однако сейчас, чаще всего, загрузка программ выделяется в отдельный процесс[2].
Для связывания модулей компоновщик использует таблицы символов, созданные компилятором в каждом из объектных модулей. Эти таблицы могут содержать символы следующих типов:
- Определённые или экспортируемые имена — функции и переменные, определённые в данном модуле и предоставляемые для использования другим модулям;
- Неопределённые или импортируемые имена — функции и переменные, на которые ссылается модуль, но не определяет их внутри себя;
- Локальные — могут использоваться внутри объектного файла для упрощения процесса настройки адресов[англ.].
Для большинства компиляторов один объектный файл является результатом компиляции одного файла с исходным кодом. Если программа собирается из нескольких объектных файлов, компоновщик собирает эти файлы в единый исполняемый файл, вычисляя и подставляя адреса вместо символов, в течение времени компоновки (статическая компоновка) или во время исполнения (динамическая компоновка).
Компоновщик может извлекать объектные файлы из специальных коллекций, называемых библиотеками. Если не все символы, на которые ссылаются пользовательские объектные файлы, определены, то компоновщик ищет их определения в библиотеках, которые пользователь подал ему на вход. Обычно одна или несколько системных библиотек используются компоновщиком по умолчанию. Когда объектный файл, в котором содержится определение какого-либо искомого символа, найден, компоновщик может включить его (файл) в исполняемый файл (в случае статической компоновки) или отложить это до момента запуска программы (в случае динамической компоновки).
Работа компоновщика заключается в том, чтобы в каждом модуле определить и связать ссылки на неопределённые имена. Для каждого импортируемого имени находится его определение в других модулях, упоминание имени заменяется на его адрес.
Компоновщик обычно не выполняет проверку типов и количества параметров процедур и функций. Если надо объединить объектные модули программ, написанные на языках со строгой типизацией, то необходимые проверки должны быть выполнены дополнительной утилитой перед запуском редактора связей.
См. также
[править | править код]Примечания
[править | править код]- ↑ John R. Levine. Linkers and Loaders. — 1999. — С. 1.
- ↑ IBM Corporation. IBM OS Linkage Editor and Loader (неопр.). — 1972. Архивировано 6 марта 2020 года.
Литература
[править | править код]- David William Barron, Assemblers and Loaders. 1972, Elsevier.
- John R. Levine, Linkers and Loaders — Morgan-Kauffman, 1999, — ISBN 1-55860-496-0
- David Salomon, Assemblers and Loaders. 1993 [1] Chapter 7 Loaders
- Linkers and Loaders by Sandeep Grover // Linux Journal
В статье есть список источников, но не хватает сносок. |