Создание общей библиотеки
В этом разделе приведены инструкции по созданию общей библиотеки.
Предварительные действия
- Создайте один или несколько исходных файлов, которые будут откомпилированы и
скомпонованы в общую библиотеку. Эти файлы
будут содержать экспортированные символы, на которые могут ссылаться другие
исходные файлы.
В примерах этого раздела используются два исходных файла, share1.c и share2.c. Файл share1.c содержит следующий текст:
Файл share2.cсодержит следующий текст:/************ * share1.c: исходный код общей библиотеки. *************/ #include <stdio.h> void func1 () { printf("func1 called\n"); } void func2 () { printf("func2 called\n"); }
Экспортируемыми символами в этих файлах являются func1, func2 и func3./************ * share2.c: исходный код общей библиотеки. *************/ void func3 () { printf("func3 called\n"); } - Создайте главный исходный файл, ссылающийся на экспортируемые символы, которые будут
входить в общую библиотеку.
В примерах этого раздела используется главный исходный файл main.c. Файл main.c содержит следующий текст:
/************ * main.c: содержит ссылки на символы, заданные в * файлах share1.c и share2.c *************/ #include <stdio.h> extern void func1 (), func2 (), func3 (); main () { func1 (); func2 (); func3 (); } - Создайте файл экспорта, необходимый для явного
экспорта символов общей библиотеки, которые могут использоваться во внешних
объектных модулях.
В примерах этого раздела используется файл экспорта shrsub.exp. Файл shrsub.exp содержит следующий текст:
Символы #! применяется только при использовании файла для импорта. В этом случае строка с #! указывает имя файла общей библиотеки, который будет применяться на этапе выполнения.#! /home/sharelib/shrsub.o * Полный путь к файлу объекта общей библиотеки func1 func2 func3
Процедура
- Скомпилируйте и скомпонуйте два исходный файла, содержащих код общей библиотеки. (Предполагается, что текущий каталог -
/home/sharedlib.)
Для компиляции и компоновки исходных файлов введите
следующие команды:
В результате выполнения этих команд будет создана общая библиотека shrsub.o в каталоге /home/sharedlib.cc -c share1.c cc -c share2.c cc -o shrsub.o share1.o share2.o -bE:shrsub.exp -bM:SRE -bnoentry- Флаг -bM:SRE
- Помечает результирующий объектный файл shrsub.o как реентерабельную объектную библиотеку
Каждый процесс, который применяет общий код, получает индивидуальную копию данных, размещенную в защищенной области процесса.
- flag
- Устанавливает фиктивную точку входа _nostart для переопределения точки входа по умолчанию _start
- Флаг -bnoentry
- Сообщает редактору связей о том, что общая библиотека не имеет точки входа.
В общей библиотеке может присутствовать точка входа, однако системный загрузчик не использует ее при загрузке общей библиотеки.
- Для помещения общей библиотеки в архивный файл введите следующую команду:
Это необязательная операция. Однако помещение библиотеки в архивный файл упрощает ее применение при компоновке программ, так как для архивных библиотек можно использовать ключи -l и -L команды ld.ar qv libsub.a shrsub.o - Откомпилируйте и скомпонуйте главный исходный файл для создания исполняемого файла. (Предполагается, что в текущем каталоге
присутствует файл main.c.) Для этого введите следующую команду:
Если общая библиотека не была помещена в архив, введите команду:cc -o main main.c -lsub -L/home/sharedlib
После этого программу main можно запускать. Символы func1, func2 и func3 помечены для отложенного связывания на этапе загрузки. На этапе выполнения системный загрузчик загрузит модуль общей библиотеки (если он еще не загружен) и динамически обработает обнаруженные ссылки.cc -o main main.c /home/sharedlib/shrsub.o -L/home/sharedlib
- Флаг -L
- Добавляет указанный каталог (в данном случае, /home/sharedlib) в путь поиска библиотеки, хранящийся в разделе загрузчика программы.
Во время работы программы путь поиска библиотек указывает загрузчику, где расположены общие библиотеки.
- Переменная среды LIBPATH
- Может использоваться в качестве пути поиска библиотек; содержит список каталогов, перечисленных через точку с запятой. Формат этой переменной совпадает с форматом переменной PATH.
Каталоги из этого списка применяются при обработке ссылок на внешние объекты. Каталоги /usr/lib и /lib содержат общие библиотеки и, как правило, должны присутствовать в пути поиска библиотек.