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