2014-01-19 4 views
2

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

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

int main(int argc, char **argv) { 
    void *handle; 
    double (*cosine)(double); 
    char *error; 

    handle = dlopen ("/lib/libm.so.6", RTLD_LAZY); 
    if (!handle) { 
     fputs (dlerror(), stderr); 
     exit(1); 
    } 

    cosine = dlsym(handle, "cos"); 
    if ((error = dlerror()) != NULL) { 
     fputs(error, stderr); 
     exit(1); 
    } 

ответ

1

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

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

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

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

5

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

Динамическая загрузка происходит, когда библиотека загружается явно (например, с использованием dlopen()), в то время как динамическая компоновка возникает, когда исполняемый файл, динамически связанный, загружается и обрабатывается неявно ОС. Цели разные.

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

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

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

+0

согласно моим знаниям Команда ldd используется для печати зависимостей разделяемой библиотеки, поэтому доступ к общей библиотеке достигается путем динамической компоновки, поэтому вся необходимая общая библиотека, такая как ** libc **, определена и разрешена до того, как программа начнет выполнение, и это называется динамической связью am i справа? – gauramit87

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