Операционная система UNIX. Руководство программиста




Пример


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

Наша библиотека будет называться libexam. Пусть ее исходный текст первоначально представляет собой единственный файл, содержащий следующее:

/* первоначальный вид exam.c */

#include <stdio.h>

extern int strlen (); extern char *malloc, *strcpy ();

int count = 0; char *Error;

char *excopy (e) char *e; { char *new;

++count; if ((new=malloc (strlen (e)+1))==0) { Error="Нет памяти"; return 0; } return strcpy (new, e); }

excount () { fprintf (stderr, "сч. вып. %d\n", count); return count: }

Для начала выберем адреса библиотечных секций команд и данных (из адресов областей, выделенных для личного пользования). Заметим, что начальные адреса секций должны быть кратны 1 Мб:

.text 0x74000000 .data 0x74100000

Далее, определим маршрутное имя разделяемой библиотеки выполнения:

/my/directory/libexam_s

Теперь нужно определить внешние (импортируемые) имена библиотеки (рекомендации по этому поводу см. в разделе Использование импортируемых имен): malloc, strcpy, strlen, fprintf и _iob. Макросы для этих имен мы поместим во включаемый файл, причем обратите внимание, что на _iob нет прямой ссылки, это делается через макрос из <stdio.h>, определяющий stderr. Заметим также, что именам даны префиксы _libexam_. Указатели на импортируемые имена, будучи доступными извне, могут совпасть с какими-либо другими именами. Использование имени библиотеки в качестве префикса уменьшает вероятность такого конфликта.

/* новый файл import.h */

#define malloc (*_libexam_malloc) #define strcpy (*_libexam_strcpy) #define strlen (*_libexam_strlen) #define fprintf (*_libexam_fprintf) #define _iob (*_libexam__iob)

extern char *malloc (); extern char *strcpy (); extern int strlen (); extern int fprintf ();

Примечание

Объект _iob не описывается в файле import.h как внешний. Предполагается, что это делается во включаемом файле <stdio.h>.




Содержание  Назад  Вперед