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


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


Когда мы создавали разделяемую библиотеку языка C...
У нас было три варианта работы с malloc. Во-первых, мы могли не включать malloc(3X) в библиотеку. malloc вызывается другими функциями библиотеки, поэтому она стала бы импортируемой. Недостаток этого варианта заключается в уменьшении экономии памяти.

Во-вторых, мы могли бы включить в библиотеку семейство malloc(3X), не импортируя его. Это дало бы экономию памяти для большинства приложений. Недостаток этого варианта заключается в том, что некоторые приложения переопределяют malloc(3X). Обращения из библиотечных функций, однако, по-прежнему направлялись бы к библиотечной malloc. Кроме того, редактор внешних связей мог бы обнаружить повторное определение malloc(3X), и чтобы избежать этого, пришлось бы либо отказаться от использования разделяемой библиотеки, либо разработчику библиотеки нужно было бы изменить ее исходный текст, устранив оттуда имя malloc(3X).

Наконец, объявив имя malloc(3X) импортируемым, мы могли бы, тем не менее, включить malloc(3X) в разделяемую библиотеку, что мы и сделали. Хотя malloc(3X) и находится в библиотеке, на нее нигде нет прямых ссылок. Если прикладная программа не переопределяет malloc(3X), как пользовательские, так и библиотечные обращения к ней используют библиотечную версию. Соответственно, если malloc переопределяется пользователем, все обращения направляются к его версии.

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

Техника импорта имен

Пусть в разделяемой библиотеке нужно сделать malloc импортируемым. Далее слева приведен исходный текст для архива, а справа - переработанный текст для разделяемой библиотеки.




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



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