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




Пример - часть 2


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

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

#include <stdio.h>

char *(*_libexam_malloc) () = 0; char *(*_libexam_strcpy) () = 0; int (*_libexam_strlen) () = 0; int (*_libexam_fprintf) () = 0; FILE (*_libexam__iob) [] = 0;

Наконец, посмотрим, какие глобальные переменные библиотеки должны быть доступны использующим ее программам (см. ниже рекомендацию "уменьшать объем глобальных даннных"). К переменной count обращаются через excount(), поэтому она может не быть описана как внешняя. Опишем ее как static (это уже должно было быть сделано и для архивной перемещаемой библиотеки).

Глобальные данные библиотеки необходимо переместить в отдельные исходные файлы (см. ниже рекомендацию "хранить функции и глобальные данные в различных исходных файлах"). Осталась единственная глобальная переменная Error, и ее нужно проинициализировать (см. ниже рекомендацию "инициализировать глобальные переменные"). Error должна остаться глобальной, поскольку через нее передается информация в вызывающую программу.

/* новый файл global.c */

char *Error = 0;

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

/* измененный exam.c */

#include "import.h"

#include <stdio.h>

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

static int count = 0; extern 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: }

Примечание

Файл import.h должен включаться ранее файла <stdio.h>.

Теперь нужно ввести файл спецификаций разделяемой библиотеки для последующего выполнения mkshlib(1):

/* новый файл libexam.sl */

1 #target /my/directory/libexam_s 2 #address .text 0x74000000 3 #address .data 0x74100000




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