Подтвердить что ты не робот

Архитектурно, в чем разница между общим объектом (SO) и динамической библиотекой ссылок (DLL)?

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Основное различие заключается в том, что по умолчанию видно по каждому типу файла..so файлы экспортируют ссылку на язык (gcc) - это означает, что (по умолчанию) все символы C и С++, которые являются "extern" доступны для связывания, когда .so втянуты. Это также означает, что, поскольку решение .so файлов по существу является этапом ссылки, загрузчик не заботится о том, из какого файла .so возникает символ. Он просто ищет указанные файлы .so в некотором порядке, следуя обычным правилам шага ссылки, к которым прикреплены файлы .a.

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

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