В примерах этого раздела используются два исходных файла, 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.
В примерах этого раздела используется главный исходный файл main.c. Файл main.c содержит следующий текст:
/************ * main.c: содержит ссылки на символы, определенные в файлах * share1.c и share2.c *************/ #include <stdio.h> extern void func1 (), unc2 (), func3 (); main () { func1 (); func2 (); func3 (); }
В примерах этого раздела используется файл экспорта shrsub.exp. Файл shrsub.exp содержит следующий текст:
#! /home/sharelib/shrsub.o * Полное имя объектного файла общей библиотеки func1 func2 func3
Строка, начинающаяся с #!, применяется только при использовании файла для импорта. В этом случае строка с #! указывает имя файла общей библиотеки, который будет применяться на этапе выполнения.
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 | Сообщает редактору связей о том, что общая библиотека не имеет точки входа. |
В общей библиотеке может присутствовать точка входа, однако системный загрузчик не использует ее при загрузке общей библиотеки.
ar qv libsub.a shrsub.o
Это необязательная операция. Однако помещение библиотеки в архивный файл упрощает ее применение при компоновке программ, так как для архивных библиотек можно использовать ключи -l и -L команды ld.
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.
Функции load, loadquery, loadbind, unload.
Формат объектного файла XCOFF (a.out).