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