MKSHLIB(1)

НАЗВАНИЕ
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 распознает следующие опции:

-s файл_спецификаций
Указывает файл спецификаций разделяемой библиотеки. Этот файл содержит информацию, необходимую для построения разделяемой библиотеки. В нем находятся спецификации таблицы переходов для разделяемой библиотеки выполнения, маршрутное имя файла, в котором должна находиться разделяемая библиотека выполнения, начальные адреса секции команд и секции данных для разделяемой библиотеки выполнения, спецификации инициализации для разделяемой библиотеки сборки и список об ектных файлов, которые должны быть включены в разделяемую библиотеку (подробности см. ниже).

-t библ_выполнения
Указывает файл, в который будет помещена создаваемая разделяемая библиотека выполнения. Для того, чтобы воспользоваться разделяемой библиотекой выполнения, ее необходимо переместить в то место, которое указано в файле спецификации (см. ниже директиву #target). Если используется опция -n, генерации разделяемой библиотеки выполнения не производится.

-h библ_сборки
Указывает файл, в который будет помещена создаваемая разделяемая библиотека сборки. Если эта опция не указана, генерации разделяемой библиотеки сборки не производится.

-n
Не генерировать разделяемую библиотеку выполнения. Эта опция используется для того, чтобы создать только разделяемую библиотеку сборки. Тем не менее, следует обязательно указывать и опцию -t, так как для создания разделяемой библиотеки сборки требуется версия разделяемой библиотеки выполнения.

-L каталог ...
Изменить алгоритм поиска для разделяемых библиотек сборки, указанных директивой #objects noload, так, что поиск вначале производится в указанном каталоге, а только потом в каталогах по умолчанию. Опция -L может быть указана в командной строке несколько раз, при этом каталоги просматриваются в указанном порядке перед поиском в каталогах по умолчанию.

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

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

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

#address секция адрес
Указывает начальный адрес секции разделяемой библиотеки выполнения. Эта директива обычно используется для задания начальных адресов секций .text и .data.

#target маршрутное_имя
Задает маршрутное_имя разделяемой библиотеки выполнения во время ее использования. Указанное имя записывается в файлы типа a.out(4), обращающиеся к разделяемой библиотеке, и служит операционной системе для поиска разделяемой библиотеки, когда она требуется выполняемому файлу.

#branch
Указывает на начало спецификаций таблицы переходов. Строки, следующие за этой директивой, трактуются как строки спецификации таблицы переходов. Строки спецификации таблицы переходов имеют следующий формат:

   имя_функции пробел_или_табуляция позиция

где имя_функции - это имя, для которого задается точка входа в таблицу переходов, а позиция задает позицию этой точки входа. Позиция может быть целым числом или диапазоном целых чисел в формате позиция1-позиция2. Каждая позиция должна быть не меньше 1; одна и та же позиция не может быть указана дважды; в таблице переходов не должно быть пропущенных позиций (каждое число от 1 до некоторого максимального должно быть обязательно задействовано).

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

#objects
Указывает имена об ектных модулей, составляющих разделяемую библиотеку выполнения. Строки, следующие за этой директивой, рассматриваются как список об ектных файлов, в том порядке, в котором они должны быть загружены в разделяемую библиотеку выполнения. Список состоит из имен файлов, разделяемых пробелами или табуляциями. Этот же список используется для определения об ектных файлов для разделяемой библиотеки сборки, но порядок их в разделяемой библиотеке сборки определяется пропуском списка через lorder(1) и tsort(1). Эта директива может встретиться в файле спецификаций разделяемой библиотеки только однажды.

#objects noload
За данной директивой следует список имен разделяемых библиотек сборки. Эти библиотеки просматриваются в том порядке, в котором они указаны, для разрешения ссылок из создаваемой разделяемой библиотеки. При этом ситуация, когда неразделяемая версия об екта обнаруживается раньше разделяемой, трактуется как ошибочная.

Имя разделяемой библиотеки сборки задается как маршрутное имя файла или как аргумент вида -lX, где libX.a является именем файла в каталоге LIBDIR или LLIBDIR. Описываемая ситуация аналогична ситуации с ld(1), и для задания других каталогов поиска библиотек можно воспользоваться опцией -L.

Отметим, что если с помощью директивы #objects noload указана разделяемая библиотека сборки, то в каждой команде cc, редактирующей связи с создаваемой разделяемой библиотекой, нужно также задавать упомянутую разделяемую библиотеку сборки.

#hide linker [*]
Эта директива делает внешние имена локальными для создаваемой разделяемой библиотеки. В последующих строках могут задаваться регулярные выражения [см. sh(1), find(1)], и если внешнее имя соответствует хотя бы одному из выражений, оно становится локальным. Оставить некоторые имена внешними можно с помощью директивы #export (см. ниже). Необязательный аргумент * эквивалентен последовательности

      #hide linker *

и приводит к тому, что все внешние имена становятся локальными.

Все имена, использованные в директивах #init и #branch, всегда являются внешними и не могут быть сделаны локальными с помощью директивы #hide.

#export linker [*]
В последующих строках могут задаваться внешние имена, которые из-за соответствия регулярным выражениям директивы #hide могли бы стать локальными. Например, последовательность директив

   #hide linker *

   #export linker

   one

   two

приводит к тому, что все имена, кроме one и two, а также тех, которые упомянуты в директивах #init и #branch, становятся локальными.

#init об ектный_файл
Указывает об ектный файл, который требует инициализации. Строки, следующие за этой директивой, рассматриваются как строки спецификации инициализации, которые должны иметь следующий формат:

   указатель пробел_или_табуляция имя

где указатель - это указатель на внешнее имя; указатель должен быть определен в об ектном_файле. Для каждой такой строки генерируются команды инициализации вида:

   указатель=&имя;

Повторная инициализация указателей не допускается, так же, как и повторное использование директивы #init для того же об ектного_файла.

#ident цепочка_символов
Задает цепочку_символов, которая будет включена в секцию комментариев (.comment) разделяемой библиотеки выполнения.

##
Комментарий. Строки, начинающиеся с ##, игнорируются.

ФАЙЛЫ


   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. Следовательно, если удаляется или переименовывается об ектный файл, включенный в разделяемую библиотеку сборки, то перед обновлением нужно обязательно удалить разделяемую библиотеку сборки.