Дилемма о разделяемых библиотеках в Unix - PullRequest
6 голосов
/ 10 декабря 2010

Если я создаю разделяемую библиотеку (разделяемый объект), я могу использовать ее двумя следующими способами:
Первый способ - использовать разделяемую библиотеку, как если бы я использовал статическую библиотеку.

           #include "myLib.h"
           //...
           //afterwards I can use functions defined in mylib.h
           myFunction();

Второй способ использования разделяемой библиотеки - вызов API-функций динамического загрузчика: dlopen, dlsym и dlclose из dlfcn.h. Я хотел бы использовать разделяемую библиотеку таким образом, когда я хочу, например, реализовать шаблон плагина. Листинг будет выглядеть так:

#include <dlfcn.h>

void  *myLib;                /*  Handle to shared lib file  */
void (*myFunction)();       /*  Pointer to loaded function  */

  //...

  //load shared object
  myLib = dlopen("/home/dlTest/myLib.so",RTLD_LAZY);
  dlerror();

  //get handle to function
  myFunction = dlsym( myLib, "myFunction");
  dlerror();

  //execute function
  (*myFunction)();

  //close lib
  dlclose(myLib);
  dlerror();

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

Второй вопрос . Как называется эти два использования? Первая называется статически связанной общей библиотекой, а вторая - динамически связанной / загруженной общей библиотекой.

Третий вопрос Если бы я создал общую библиотеку без флага -fPIC (независимый от кода) код, смогу ли я использовать ее другим способом?

Приветствия

Ответы [ 2 ]

5 голосов
/ 10 декабря 2010

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

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

5 голосов
/ 10 декабря 2010

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

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