2014-11-04 2 views
0

Я знаю, что эти вопросы были заданы раньше, но я все еще не могу примирить все вместе в общую картину.связывание, загрузка и виртуальная память

  1. статического против динамической библиотеки
    • статических библиотеки их код копируются и связанные в результате исполняемого
    • статических библиотеки только скопировать и соединить необходимые модули в исполняемый файл, а не вся реализация библиотеки
    • Статические библиотеки не должны быть скомпилированы как PIC, поскольку они отделены от полученного исполняемого файла
    • динамические библиотеки копируют и связывают в виде заглушек, которые описывают h ow для загрузки/ссылки (?) реализация функции во время выполнения
    • динамические библиотеки могут быть PIC или перемещаемыми
    • Почему существуют отдельные статические и динамические библиотеки? Все вышеизложенное, похоже, является задачей статического или динамического компоновщика. Зачем нужны 2 библиотеки, которые реализуют scanf?
    • (бонус # 1) что такое общая библиотека обратитесь к? Я слышал, что он используется как (1) общий зонтичный термин, синоним библиотеки, (2) непосредственно в динамической библиотеке, (3) использование виртуальной памяти для сопоставления той же физической памяти библиотеки с несколькими адресными пространствами. Можете ли вы сделать это только с динамическими библиотеками? (4), имеющих разные версии одной и той же динамической библиотеки в памяти.
    • (bonus # 2) Стандартные библиотеки (libc, libC++, stdlibC++, ..) связаны динамически или статически по умолчанию? Я никогда не нужно dlopen() ..
  2. статический против динамического связывания
    • , как это по-другому, чем статические против динамических библиотек? Я не понимаю, почему существует не только одна библиотека, и мы используем статический или динамический компоновщик (кроме проблемы с ПОС). Вместо того, чтобы говорить о статических vs динамических библиотеках, мы должны вместо этого обсуждать более общую статическую динамическую связь?
    • разрешение символа все еще выполнено во время компиляции для обоих?
  3. статические против динамической нагрузки
    • статической нагрузки означает копирование полный исполняемый файл в ММ перед выполнением
    • Динамическая загрузка означает, что только исполняемый заголовок копируется в ММ перед выполнением, дополнительные функциональные возможности загружается в MM по запросу. Как это отличается от пейджинга?
    • Если исполняемый файл динамически связан, то почему он не будет динамически загружаться?
    • как статическая нагрузка и динамическая нагрузка может или не может выполнить перемещение

Я знаю, что есть много вещей, которые я не совсем понимаю здесь - и я не обязательно ищет кого-то адрес каждый выпуск.Я надеюсь, перечисляя все, что меня сбивает с толку, что кто-то, кто это понимает, увидит, где провал в моем понимании находится на широком уровне, и уметь рисовать большую картину того, как эти вещи взаимодействуют друг с другом.

+0

Если на Linux, прочитайте [статью Drepper: * Как писать общие библиотеки *) (http://people.redhat.com/drepper/dsohowto.pdf).Это длинная статья, но она отвечает на большинство ваших вопросов. –

+0

@BasileStarynkevitch Спасибо за бумагу - я ее прочту! Знают ли различия между ОС? – user167524

+0

Читайте также [Книга Левина: * Линкеры и загрузчики *] (http://www.iecc.com/linker/) –

ответ

2

почему 2 типа Lib загрузка

  • динамические экономит пространство (вы не имеют сотни копий одного и ту же коду во всех исполняемых файлах с помощью foo.lib
  • динамических позволяет foo.lib продавец может отправить новую версию библиотека и существующий код используют ее
  • статические упрощают управление зависимостями - в t heory двоичный может быть один файл

Что такое 'общая библиотека'

  • имя Unix для динамической библиотеки. Windows, называет его DLL

Существуют стандартные библиотеки статической или динамической

  • зависит от платформы. На некоторых вы можете выбрать на других, выбранных вами для вас. Например, на windwos есть переключатели компилятора, чтобы сказать, хотите ли вы статические или динамические промежутки времени. Не путать DonT динамического использования библиотеки с dlopen - см позже

«почему мы говорим о 2 различных типах библиотеки»

Обычно статическая библиотека находится в формате, отличном от динамического. Обычно статическая библиотека вводится в компоновщик так же, как и любой другой блок компиляции. Компилятор обычно выводит динамическую библиотеку. Они используются по-разному, даже если они оба обеспечивают один и тот же кусок кода в приложение

разрешение Символа будет доработано во время загрузки для DLL

Полной динамической нагрузки. Это область dlopen. Здесь вы хотите вызывать точки входа в библиотеке, которые могут отсутствовать даже при компиляции. Прецеденты:

  • плагинов, которые соответствуют хорошо известным интерфейсом, но там может быть много реализаций (PAM и NSS являются хорошими примерами). Приложение выбирает загрузку одной или нескольких реализаций из указанных файлов во время выполнения

  • приложение должно загрузить библиотеку и вызвать произвольную функцию. Представьте себе, как, например, как язык сценариев может загружать и вызывать произвольный метод

Чтобы использовать .so на UNIX вам не нужно использовать dlopen. Вы можете загрузить его для вас (то же самое в окнах). Чтобы действительно динамически загружать общую библиотеку lib/dll, вам нужно dlopen или LoadLibrary

0

Обратите внимание, что статически связанные библиотеки загружаются быстрее, так как меньше файлов на диске для всех файлов библиотеки времени выполнения. Если библиотеки небольшие и очень необычные, возможно, лучше связывать статически. Если существуют серьезные зависимости от версии/функциональные различия, такие как MFC, DLL нужны разные имена.

+1

Я не уверен в этом, по крайней мере, в Linux. Обычно используемая совместно используемая библиотека (например, 'libc.so.6' или' libX11.so.6') в Linux уже будет «mmap'-ed в ОЗУ. Если он был статически связан, вам нужно получить его для & из каждого исполняемого файла. –

Смежные вопросы