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

Разница между динамической нагрузкой и динамической связью?

Рутина не загружается до ее вызова. Все подпрограммы хранятся на диске в формате повторной локализации. Основная программа загружается в память и выполняется. Это называется динамическим связыванием.

Почему это называется Динамическое связывание? Не должно быть динамической загрузки, так как Routine не загружается до тех пор, пока он не будет вызван в динамической загрузке, где, как в динамической компоновке, привязка переносится до момента выполнения.

4b9b3361

Ответ 1

Динамическая загрузка означает загрузку библиотеки (или любого другого двоичного файла, если на то пошло) в память во время загрузки или времени выполнения.

Динамическая загрузка может быть похожей на плагины, то есть exe может фактически выполняться до того, как произойдет динамическая загрузка (например, динамическую загрузку можно создать с помощью вызова LoadLibrary на C или С++)

Динамическое связывание относится к связыванию, которое выполняется во время загрузки или во время выполнения, а не при создании exe.

В случае динамической компоновки компоновщик при создании exe делает минимальную работу. Для динамического компоновщика для работы он действительно должен загружать библиотеки тоже. Это также называется связующим загрузчиком.

Следовательно, предложения, которые вы ссылаетесь, могут иметь смысл, но они все еще довольно неоднозначны, поскольку мы не можем вывести контекст, в котором он ссылается. Можете ли вы сообщить нам, где вы находите эти строки и в каком контексте говорит автор?

Ответ 2

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

Вот ссылка на полный ответ Джеффа Дарси на Quora

http://www.quora.com/Systems-Programming/What-is-the-exact-difference-between-Dynamic-loading-and-dynamic-linking/answer/Jeff-Darcy

Ответ 3

Этот ответ предполагает, что вы знаете основную команду Linux.

В Linux есть два типа библиотек: статические или общие.

enter image description here

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

Хотя для вызова функций в разделяемой библиотеке у вас есть два варианта.

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

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

Выдержка из Википедии:

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

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

Вот мой вывод ldd ./dl:

linux-vdso.so.1 =>  (0x00007fffe6b94000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f400f1e0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f400ee10000)
/lib64/ld-linux-x86-64.so.2 (0x00007f400f400000)

Как видите, dl - это динамический исполняемый файл, который зависит от libdl, который динамически связан с ld.so, динамическим компоновщиком Linux при запуске dl. То же самое верно для других 3 библиотек в списке.

libm не отображается в этом списке, потому что он используется в качестве динамически загружаемой библиотеки. Он не загружается, пока ld не будет предложено загрузить его.

Ответ 4

Я также читаю "книгу динозавров" и был смущен концепцией загрузки и связывания. Вот мое понимание:

  1. Динамическая загрузка и связывание происходят во время выполнения и загружают все, что им нужно, в память.

  2. Основное отличие состоит в том, что динамическая загрузка проверяет, была ли подпрограмма загружена загрузчиком, а динамическое связывание проверяет, находится ли подпрограмма в памяти.

  3. Следовательно, для динамического связывания в памяти есть только одна копия кода библиотеки, что может быть неверно для динамической загрузки. Поэтому для динамической компоновки требуется поддержка ОС для проверки памяти других процессов. Эта функция очень важна для библиотек языковых подпрограмм, которые используются многими программами.

Ответ 5

Динамический компоновщик - это программа времени выполнения, которая загружает и связывает все динамические зависимости программы перед началом выполнения этой программы. Динамический компоновщик найдет, какие динамические библиотеки потребует программа, какие библиотеки нужны этим библиотекам (и т.д.), Затем загрузит все эти библиотеки и убедитесь, что все ссылки на функции затем правильно указывают на нужное место. Например, даже самая базовая программа "привет мир" обычно требует, чтобы библиотека C отображала результат, и поэтому динамический компоновщик загружает библиотеку C перед загрузкой глобальной программы hello и будет следить за тем, чтобы любые вызовы printf() на правильный код.

Ответ 6

Dynamic Loading: Загрузите процедуру в основной памяти при вызове.

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

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

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

Рутина не загружается до ее вызова. Все подпрограммы хранятся на диске в формате повторной локализации. Основная программа загружается в память и выполняется. Это называется динамическим связыванием.

Заявление неполное. "Основная программа загружается в основную память и выполняется". не указывается при загрузке программы.

Если мы рассмотрим, что он загружается по вызову, поскольку оператор 1 st указывает, что его Динамическая загрузка

Ответ 7

Мы используем динамическую загрузку для лучшего использования пространства

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

<сильные > Преимущества

  • Неиспользуемая процедура никогда не загружается. Это наиболее полезно, когда программный код является большим, когда редко встречающиеся случаи необходимы для ошибок. В этом случае, хотя программный код большой, используется код будет небольшим.
  • Динамическая загрузка не требует специальной поддержки от O.S. Это ответственность пользователя за разработку своей программы, чтобы воспользоваться преимуществами method.However, O.S может предоставить библиотеки, чтобы помочь программисту

Ответ 8

Существует два типа связывания Static и Dynamic, когда выходной файл выполняется без каких-либо зависимостей (files = Library) во время выполнения, этот тип связывания называется Static, где Dynamic имеет два типа. 1. Динамическая загрузка. Динамическое связывание времени выполнения. Ниже описаны

Динамическое связывание относится к связыванию во время выполнения, когда файлы библиотек приводятся в первичную память и связаны.. (Независимо от вызова функции они связаны).

Динамическое связывание времени выполнения относится к связыванию, когда это необходимо, это означает, что всякий раз, когда происходит вызов функции в это время, связывание во время выполнения. Не все функции связаны, и это отличается от написания кода.

Ответ 9

Режимы динамического связывания

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

Statical Aware (Load-Time) Динамическое связывание

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

Во время компиляции: динамический • библиотека экспортирует файл • ader, указывая все, что относится к интерфейсу ABI библиотек.

Во время соединения: - Список динамических библиотек, требуемых проектом - Пути к двоичным файлам динамической библиотеки, необходимые двоичному файлу клиента для настройки списка ожидаемых символов библиотеки.

Дополнительные сведения о том, как можно указывать пути, см. В разделе "Правила размещения библиотеки времени сборки". - Необязательные флаги компоновщика, указывающие детали процесса компоновки

Динамическое связывание во время выполнения

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

Во время компиляции: - Файл заголовка экспорта динамических библиотек, определяющий все, что относится к интерфейсу ABI библиотек.

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

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

Источник: Advanced C и C++ Компиляция, Милан Стеванович.