В архитектурном отношении, в чем разница между разделяемым объектом (SO) и библиотекой динамических ссылок (DLL)? - PullRequest
18 голосов
/ 06 июня 2011

Вопрос в значительной степени заключается в названии: с точки зрения реализации на уровне ОС, как разделяются общие объекты и библиотеки?

Причина, по которой я спрашиваю это, заключается в том, что я недавно прочитал эту страницу о расширении Python, в которой говорится:

Unix и Windows используют совершенно разные парадигмы для загрузки кода во время выполнения. Прежде чем пытаться создать модуль, который может быть динамически загружен, узнайте, как работает ваша система.

В Unix файл общего объекта (.so) содержит код, который будет использоваться программой, а также имена функций и данных, которые он ожидает найти в программе. Когда файл присоединяется к программе, все ссылки на эти функции и данные в коде файла изменяются, чтобы указывать на фактические места в программе, где функции и данные помещаются в память. Это в основном операция ссылки.

В Windows файл динамически подключаемой библиотеки (.dll) не имеет висячих ссылок. Вместо этого доступ к функциям или данным проходит через справочную таблицу. Таким образом, код DLL не должен быть исправлен во время выполнения для обращения к памяти программы; вместо этого код уже использует таблицу поиска DLL, и таблица поиска изменяется во время выполнения, чтобы указывать на функции и данные.

Может ли кто-нибудь уточнить это? В частности, я не уверен, что понимаю описание общих объектов, содержащих ссылки на то, что они ожидают найти. Аналогично, DLL звучит для меня почти как тот же механизм.

Это полное объяснение того, что происходит? Есть ли лучшие? Есть ли какая-то разница?

Мне известно, как связать DLL или общий объект и несколько механизмов (списки .def, dllexport / dllimport) для написания DLL, так что я явно не ищу, как это сделать в этих областях; Я более заинтригован тем, что происходит на заднем плане.

(Изменить: еще один очевидный момент - я знаю, что они работают на разных платформах, используют разные типы файлов (ELF против PE), ABI-несовместимы и т. Д ...)

1 Ответ

17 голосов
/ 06 июня 2011

Dll - это почти тот же механизм, который используется в файлах .so или .dylib (MacOS), поэтому очень трудно точно объяснить, в чем различия.

Основное различие заключается в том, чтовидимый по умолчанию из каждого типа файла.Файлы .so экспортируют связывание на уровне языка (gcc) - это означает, что (по умолчанию) все символы C & c ++, являющиеся «внешними», доступны для связывания при извлечении .so. Это также означает, что при разрешении файлов .soПо сути, это шаг ссылки, загрузчик не заботится о том, из какого файла поступил символ.Он просто выполняет поиск в указанных .so-файлах в некотором порядке, следуя обычным правилам шага ссылки, которых придерживаются .a-файлы.

С другой стороны, файлы Dll являются функцией операционной системы, полностью отделенной от шага ссылки вязык.MSVC использует .lib-файлы для компоновки как статических, так и динамических библиотек (каждый файл dll генерирует парный .lib-файл, который используется для компоновки), поэтому результирующая программа полностью «связывается» (с языковой точки зрения) после того, как ее построили,

На этапе компоновки, однако, символы были разрешены в библиотеках, представляющих библиотеки DLL, что позволило компоновщику построить таблицу импорта в файле PE, содержащем явный список библиотек DLL и точек входа, на которые есть ссылки в каждой библиотеке библиотек DLL.Во время загрузки Windows не нужно выполнять «ссылку» на разрешение символов из общих библиотек: этот шаг уже сделан - загрузчик Windows просто загружает библиотеки DLL и напрямую подключает функции.

...