[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


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

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

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

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

    /************
     * share1.c: shared library source.
    *************/
     
    #include <stdio.h>
     
    void func1 ()
     {
       printf("вызвана func1\n");
     }
     
    void func2 ()
     {
       printf("вызвана func2\n");
     }
    

    Файл share2.cсодержит следующий текст:

    /************
     * share2.c: shared library source.
    *************/
     
    void func3 ()
     {
       printf("вызвана func3\n");
     }
    

    Экспортируемыми символами в этих файлах являются func1, func2 и func3.

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

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

    /************
     * main.c: содержит ссылки на символы, определенные в файлах
     * share1.c и share2.c
    *************/
     
    #include <stdio.h>
     
      extern void func1 (),
                     unc2 (),
                     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 как реентерабельную объектную библиотеку

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

    флаг Устанавливает фиктивную точку входа _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 помечены для отложенного связывания на этапе загрузки. На этапе выполнения системный загрузчик загрузит модуль общей библиотеки (если он еще не загружен) и динамически обработает обнаруженные ссылки.


Флаг -L Добавляет указанный каталог (в данном случае, /home/sharedlib) в путь поиска библиотеки, хранящийся в разделе загрузчика программы.

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

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

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

Связанная информация

Глава 19, Общие библиотеки, общая память и подсистема malloc.

Команды ar, as, cc, ld .

Функции load, loadquery, loadbind, unload.

Формат объектного файла XCOFF (a.out).


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]