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

17
  

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

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

    
задан Luv 07.04.2012 в 08:56
источник

8 ответов

19

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

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

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

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

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

ответ дан Desert Ice 07.04.2012 в 09:30
  • Эти предложения находятся в главе «Управление памятью» знаменитой книги Silberschatz, Galvin, Gagne по операционным системам –  Arjun J Rao 09.01.2014 в 13:32
5

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

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

Ссылка

    
ответ дан user1995120 03.02.2014 в 04:15
4

Я также читаю «книгу динозавров» и смущен концепцией загрузки и компоновки. Вот мое понимание:

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

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

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

ответ дан Zheng Gao 12.10.2016 в 17:27
2

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

    
ответ дан Diya 13.07.2013 в 14:32
2

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

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

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

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

  

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

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

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

    
ответ дан Ankita Rane 16.05.2015 в 08:39
1

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

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

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

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

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

    
ответ дан navigaid 30.08.2017 в 13:58
1

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

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

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

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

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

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

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

    
ответ дан user3350897 25.02.2014 в 12:07