НАЗВАНИЕ
mkshlib - создание разделяемой библиотеки
СИНТАКСИС
mkshlib -s файл_спецификаций [-t библ_выполнения] [-h библ_сборки] [-n] [-L каталог] [-q]
ОПИСАНИЕ
Команда mkshlib создает как разделяемые библиотеки выполнения, так и разделяемые библиотеки сборки. Разделяемая библиотека очень похожа на обычную, неразделяемую
об ектную библиотеку, но отличается тем, что программы,
собранные с разделяемой библиотекой, будут во время выполнения пользоваться одним и тем же экземпляром секций
команд библиотечных подпрограмм, тогда как в случае неразделяемых библиотек в каждом процессе имеется своя
копия библиотечных подпрограмм.
Разделяемая библиотека сборки - это архив, который используется при редактировании связей между программами пользователя и разделяемой библиотекой [см. ar(4)]. С разделяемой библиотекой сборки можно работать точно так же, как и с неразделяемой, она может обычным образом включаться в команду cc(1). Кроме того, все операции, которые можно выполнять над архивом, могут быть выполнены и над разделяемой библиотекой сборки.
Разделяемая библиотека выполнения - это выполняемый модуль, который присоединяется к процессу пользователя во время выполнения программы, использующей разделяемую библиотеку. Разделяемая библиотека выполнения содержит секции команд всех подпрограмм библиотеки; в ней не должно быть неразрешенных ссылок. Разделяемая библиотека выполнения будет загружена в память во время выполнения программы, использующей разделяемую библиотеку, и другие процессы, использующие ту же библиотеку, будут разделять уже загруженные в память секции команд, но каждый процесс будет иметь свою копию секции данных.
Интерфейс пользователя с командой mkshlib состоит из опций командной строки и файла спецификаций, описывающего содержимое разделяемой библиотеки.
Команда mkshlib производит вызов других программ, таких как ar(1), as(1), ld(1). Обращение к другим программам происходит с помощью системного вызова execvp [см. exec(2)], который ищет нужную программу в каталогах из списка поиска, хранящегося в переменной PATH. Команда mkshlib обрабатывает префиксы так же, как и команда cc(1); все программы, к которым производится обращение, получают тот же префикс. Например, pfxmkshlib вызовет pfxld.
Команда mkshlib распознает следующие опции:
Файл спецификаций разделяемой библиотеки содержит информацию, необходимую для создания как разделяемой библиотеки сборки, так и разделяемой библиотеки выполнения. Содержимое и формат файла спецификаций задается директивами, перечисленными ниже.
Каждая директива, за которой может следовать несколько строк спецификаций, действует до тех пор, пока не закончится файл или не встретится другая директива.
имя_функции пробел_или_табуляция позициягде имя_функции - это имя, для которого задается точка входа в таблицу переходов, а позиция задает позицию этой точки входа. Позиция может быть целым числом или диапазоном целых чисел в формате позиция1-позиция2. Каждая позиция должна быть не меньше 1; одна и та же позиция не может быть указана дважды; в таблице переходов не должно быть пропущенных позиций (каждое число от 1 до некоторого максимального должно быть обязательно задействовано).
Если для имени выделяется более одной точки входа путем спецификации для него диапазона позиций или путем указания одного и того же имени в разных строках спецификации таблицы переходов, то используется максимальная из выделенных позиций. Все остальные позиции таблицы переходов могут рассматриваться как пустые, в которые в новых версиях разделяемой библиотеки могут быть занесены новые функции.
Имя разделяемой библиотеки сборки задается как маршрутное имя файла или как аргумент вида -lX, где libX.a является именем файла в каталоге LIBDIR или LLIBDIR. Описываемая ситуация аналогична ситуации с ld(1), и для задания других каталогов поиска библиотек можно воспользоваться опцией -L.
Отметим, что если с помощью директивы #objects noload указана разделяемая библиотека сборки, то в каждой команде cc, редактирующей связи с создаваемой разделяемой библиотекой, нужно также задавать упомянутую разделяемую библиотеку сборки.
#hide linker *и приводит к тому, что все внешние имена становятся локальными.
Все имена, использованные в директивах #init и #branch, всегда являются внешними и не могут быть сделаны локальными с помощью директивы #hide.
#hide linker * #export linker one twoприводит к тому, что все имена, кроме one и two, а также тех, которые упомянуты в директивах #init и #branch, становятся локальными.
указатель пробел_или_табуляция имягде указатель - это указатель на внешнее имя; указатель должен быть определен в об ектном_файле. Для каждой такой строки генерируются команды инициализации вида:
указатель=&имя;Повторная инициализация указателей не допускается, так же, как и повторное использование директивы #init для того же об ектного_файла.
ФАЙЛЫ
LIBDIR Обычно /lib. LLIBDIR Обычно /usr/lib. TMPDIR/* Временные файлы.
Обычно каталог TMPDIR - это /usr/tmp, однако данное соглашение можно изменить, присвоив переменной окружения TMPDIR другое значение [см. tempnam( ) в tmpnam(3S)].
СМ. ТАКЖЕ
ar(1), as(1), cc(1), ld(1), lorder(1), tsort(1).
a.out(4), ar(4) в Справочнике программиста.
ОГРАНИЧЕНИЯ
Опцию -n нельзя использовать одновременно с директивой
#objects noload. Если указать разделяемую библиотеку
сборки, которая уже существует, то mkshlib обновит ее с
помощью команды ar -ru. Следовательно, если удаляется
или переименовывается об ектный файл, включенный в разделяемую библиотеку сборки, то перед обновлением нужно
обязательно удалить разделяемую библиотеку сборки.