Создание общей библиотеки

В этом разделе приведены инструкции по созданию общей библиотеки.

Предварительные действия

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

    В примерах этого раздела используются два исходных файла, share1.c и share2.c. Файл share1.c содержит следующий текст:

    
    /************
      * share1.c: исходный код общей библиотеки.
    *************/
    
    #include <stdio.h>
    
    void func1 ()
     {
          printf("func1 called\n");
     }
    
    void func2 ()
     {
          printf("func2 called\n");
     }
    Файл share2.cсодержит следующий текст:
    /************
      * share2.c: исходный код общей библиотеки.
    *************/
    
    void func3 ()
     {
          printf("func3 called\n");
     }
    Экспортируемыми символами в этих файлах являются func1, func2 и func3.
  2. Создайте главный исходный файл, ссылающийся на экспортируемые символы, которые будут входить в общую библиотеку.

    В примерах этого раздела используется главный исходный файл main.c. Файл main.c содержит следующий текст:

    
    /************
      * main.c: содержит ссылки на символы, заданные в
     * файлах share1.c и share2.c
    *************/
    
    #include <stdio.h>
    
        extern void func1 (),
                     func2 (),
                     func3 ();
    main ()
     {
                     func1 ();
                     func2 ();
                     func3 ();
     }
  3. Создайте файл экспорта, необходимый для явного экспорта символов общей библиотеки, которые могут использоваться во внешних объектных модулях.

    В примерах этого раздела используется файл экспорта shrsub.exp. Файл shrsub.exp содержит следующий текст:

    
    #! /home/sharelib/shrsub.o 
    * Полный путь к файлу объекта общей библиотеки
    func1
    func2
    func3
    Символы #! применяется только при использовании файла для импорта. В этом случае строка с #! указывает имя файла общей библиотеки, который будет применяться на этапе выполнения.

Процедура

  1. Скомпилируйте и скомпонуйте два исходный файла, содержащих код общей библиотеки. (Предполагается, что текущий каталог - /home/sharedlib.) Для компиляции и компоновки исходных файлов введите следующие команды:
    cc -c share1.c
    cc -c share2.c
    cc -o shrsub.o share1.o share2.o -bE:shrsub.exp -bM:SRE -bnoentry
    В результате выполнения этих команд будет создана общая библиотека shrsub.o в каталоге /home/sharedlib.
    Флаг -bM:SRE
    Помечает результирующий объектный файл shrsub.o как реентерабельную объектную библиотеку

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

    flag
    Устанавливает фиктивную точку входа _nostart для переопределения точки входа по умолчанию _start
    Флаг -bnoentry
    Сообщает редактору связей о том, что общая библиотека не имеет точки входа.

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

  2. Для помещения общей библиотеки в архивный файл введите следующую команду:
    ar qv libsub.a shrsub.o
    Это необязательная операция. Однако помещение библиотеки в архивный файл упрощает ее применение при компоновке программ, так как для архивных библиотек можно использовать ключи -l и -L команды ld.
  3. Откомпилируйте и скомпонуйте главный исходный файл для создания исполняемого файла. (Предполагается, что в текущем каталоге присутствует файл main.c.) Для этого введите следующую команду:
    cc -o main main.c -lsub -L/home/sharedlib
    Если общая библиотека не была помещена в архив, введите команду:
    cc -o main main.c /home/sharedlib/shrsub.o -L/home/sharedlib
    После этого программу main можно запускать. Символы func1, func2 и func3 помечены для отложенного связывания на этапе загрузки. На этапе выполнения системный загрузчик загрузит модуль общей библиотеки (если он еще не загружен) и динамически обработает обнаруженные ссылки.
Прим.: При создании общей библиотеки объекта C++ в файле экспорта следует использовать измененные имена символов C++. Обратите внимание, что в компиляторе C++ должна быть предусмотрена опция создания общей библиотеки. Дополнительная информация приведена в документации по компилятору.
Флаг -L
Добавляет указанный каталог (в данном случае, /home/sharedlib) в путь поиска библиотеки, хранящийся в разделе загрузчика программы.

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

Переменная среды LIBPATH
Может использоваться в качестве пути поиска библиотек; содержит список каталогов, перечисленных через точку с запятой. Формат этой переменной совпадает с форматом переменной PATH.

Каталоги из этого списка применяются при обработке ссылок на внешние объекты. Каталоги /usr/lib и /lib содержат общие библиотеки и, как правило, должны присутствовать в пути поиска библиотек.