Вопрос в значительной степени заключается в названии: с точки зрения реализации на уровне ОС, как разделяются общие объекты и библиотеки?
Причина, по которой я спрашиваю это, заключается в том, что я недавно прочитал эту страницу о расширении Python, в которой говорится:
Unix и Windows используют совершенно разные парадигмы для загрузки кода во время выполнения. Прежде чем пытаться создать модуль, который может быть динамически загружен, узнайте, как работает ваша система.
В Unix файл общего объекта (.so) содержит код, который будет использоваться программой, а также имена функций и данных, которые он ожидает найти в программе. Когда файл присоединяется к программе, все ссылки на эти функции и данные в коде файла изменяются, чтобы указывать на фактические места в программе, где функции и данные помещаются в память. Это в основном операция ссылки.
В Windows файл динамически подключаемой библиотеки (.dll) не имеет висячих ссылок. Вместо этого доступ к функциям или данным проходит через справочную таблицу. Таким образом, код DLL не должен быть исправлен во время выполнения для обращения к памяти программы; вместо этого код уже использует таблицу поиска DLL, и таблица поиска изменяется во время выполнения, чтобы указывать на функции и данные.
Может ли кто-нибудь уточнить это? В частности, я не уверен, что понимаю описание общих объектов, содержащих ссылки на то, что они ожидают найти. Аналогично, DLL звучит для меня почти как тот же механизм.
Это полное объяснение того, что происходит? Есть ли лучшие? Есть ли какая-то разница?
Мне известно, как связать DLL или общий объект и несколько механизмов (списки .def, dllexport / dllimport) для написания DLL, так что я явно не ищу, как это сделать в этих областях; Я более заинтригован тем, что происходит на заднем плане.
(Изменить: еще один очевидный момент - я знаю, что они работают на разных платформах, используют разные типы файлов (ELF против PE), ABI-несовместимы и т. Д ...)