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


Использование импортируемых имен - часть 3


/* см. ниже pointers.c */

extern char *malloc(); extern char *(*_libc_malloc)();

export () export () { { . . . . . . p=malloc (n); p=(*_libc_malloc) (n); . . . . . . } }

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

Чтобы указать препроцессору C-компилятора, в каком каталоге искать файл с макросами, можно использовать опцию -I команды cpp(1). Далее снова приведены два варианта исходного текста включаемого файла import.h, причем справа записан вариант для разделяемой библиотеки:

/* пустой файл */ /* Макросы для импортируемых имен: по одному на имя. */ . . . #define malloc (*_libc_malloc) . . .

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

Общий исходный текст:

#include "import.h"

extern char *malloc ();

export() { . . . p=malloc (n); . . . }

В случае использования разделяемого варианта import.h описание malloc() в действительности есть описание указателя _libc_malloc.

Другой вариант: поместить #include внутрь #ifdef:

#ifdef SHLIB # include "import.h" #endif

extern char *malloc ();

export() { . . . p=malloc (n); . . . }

сборки, она модифицирует файл pmalloc.o, добавив туда перемещаемые команды, соответствующие оператору присваивания:

_libc_malloc = &malloc;

Эти команды редактор внешних связей извлечет из разделяемой библиотеки сборки вместе с файлом pmalloc.o и поместит в выполняемый файл. Затем редактор разрешит внешние ссылки и соберет все фрагменты инициализации вместе. При запуске выполняемого файла стартовая процедура crt1 выполнит эти фрагменты, установив таким образом правильные значения библиотечных указателей.




Начало  Назад  Вперед



Книжный магазин