Что делает 'статически связанный' и 'динамично связанный' средний?

Независимо от того, что вы делаете в конечном итоге, убедитесь, что вы проверяете, что ваш вход еще не был искажен magic_quotes или каким-то другим благонамеренным мусором, и, если необходимо, запустите его через stripslashes или что-то еще, чтобы его дезинфицировать .

216
задан UnkwnTech 22 March 2019 в 05:22
поделиться

4 ответа

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

первой является компиляция, которая превращает исходный код в объектные модули.

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

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

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

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

Это - в основном метод задержанного соединения. Существует даже [еще 115] задержанный метод (названный поздним связыванием в некоторых системах), который не введет динамично связанный файл, пока Вы на самом деле не попытаетесь вызвать функцию в нем.

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

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

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

<час>

Как пример , давайте посмотрим на случай пользователя, компилирующего их main.c файл для статического и динамического подключения.

Phase     Static                    Dynamic
--------  ----------------------    ------------------------
          +---------+               +---------+
          | main.c  |               | main.c  |
          +---------+               +---------+
Compile........|.........................|...................
          +---------+ +---------+   +---------+ +--------+
          | main.o  | | crtlib  |   | main.o  | | crtimp |
          +---------+ +---------+   +---------+ +--------+
Link...........|..........|..............|...........|.......
               |          |              +-----------+
               |          |              |
          +---------+     |         +---------+ +--------+
          |  main   |-----+         |  main   | | crtdll |
          +---------+               +---------+ +--------+
Load/Run.......|.........................|..........|........
          +---------+               +---------+     |
          | main in |               | main in |-----+
          | memory  |               | memory  |
          +---------+               +---------+

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

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

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

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

423
ответ дан paxdiablo 23 November 2019 в 04:16
поделиться

Я думаю, что хороший ответ на этот вопрос должен объяснить, что соединение .

при компиляции некоторого кода C (например), он переводится в машинный язык. Просто последовательность байтов, которая, когда выполнено, заставляет процессор добавлять, вычитает, выдерживает сравнение, "goto", считала память, пишет память, такую вещь. Этот материал хранится в объекте (.o) файлы.

Теперь, давным-давно, программисты изобрели эту вещь "подпрограммы". Execute-this-chunk-of-code-and-return-here. Это не было слишком длинно, прежде чем они поняли, что самые полезные подпрограммы могли храниться в специальном месте и использоваться любой программой, для которой были нужны они.

Теперь в программистах первых лет должен был бы перфорировать в адрес памяти, в котором были расположены эти подпрограммы. Что-то как CALL 0x5A62. Это было утомительно, и проблематичный должен, те адреса памяти когда-либо должны изменяться.

Так, процесс был автоматизирован. Вы пишете программу, которая звонит printf(), и компилятор не знает адреса памяти printf. Таким образом, компилятор просто пишет CALL 0x0000 и добавляет, что примечание к высказыванию объектного файла "должно заменить этот 0x0000 ячейкой памяти [1 120] printf".

Статическая связь означает, что программа компоновщика (GNU, которым каждого называют ld) добавляет printf машинный код непосредственно к Вашему исполняемому файлу и изменяет 0x0000 на адрес printf. Это происходит, когда Ваш исполняемый файл создается.

Динамическая связь означает, что вышеупомянутого шага не происходит. Исполняемый файл все еще имеет примечание, в котором говорится, "должен заменить 0x000 ячейкой памяти printf". Загрузчик операционной системы должен найти код printf, загрузить его в память и исправить адрес ВЫЗОВА, каждый раз, когда программа запущена .

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

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

215
ответ дан Peter Mortensen 23 November 2019 в 04:16
поделиться

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

30
ответ дан John D. Cook 23 November 2019 в 04:16
поделиться

(Я не знаю C#, но интересно иметь понятие статического подключения для языка VM)

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

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

2
ответ дан artificialidiot 23 November 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: