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

       

Обеспечение совместимости с будущими версиями


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

Проверка версий библиотеки на совместимость

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

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

Пусть нам нужно сравнить две разделяемые библиотеки выполнения: new.libx_s и old.libx_s. Мы используем команду nm(1) для получения списка имен и sed(1) для исключения всех имен, кроме внешних. Работу может облегчить небольшой sed-сценарий, который мы поместим в файл cmplib.sed:

/|extern|.*/!d s/// /^.bt/d /^etext /d /^edata /d /^end /d

Согласно этому сценарию будут удалены все строки, кроме тех, где упомянуты внешние имена, а затем останутся только сами эти имена и их значения (адреса). Последние четыре строки удаляют специальные имена, не влияющие на совместимость библиотек, так как они невидимы для прикладных программ.

Теперь можно получить списки имен и их адресов для обеих библиотек, старой и новой:

nm old.libx_s | sed -f cmplib.sed > old.nm nm new.libx_s | sed -f cmplib.sed > new.nm

Сравним теперь соответствующие адреса:

diff old.nm new.nm

Утилита diff(1) не выведет ничего, если все соответствующие имена обеих библиотек имеют одинаковые адреса. В этом случае библиотеки совместимы. Если diff(1) что-либо выведет, адреса некоторых имен отличаются, поэтому библиотеки, возможно, несов- местимы. О diff(1) и sed(1) см. также в Справочнике пользователя.


Как работать с несовместимыми библиотеками

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

Поэтому Вы можете воспользоваться другим вариантом: дать новой версии разделяемой библиотеки выполнения новое маршрутное имя. Маршрутные имена разделяемых библиотек сборки и выполнения независимы, поэтому маршрутное имя разделяемой библиотеки сборки можно не менять. Новые выполняемые файлы будут работать с новой разделяемой библиотекой выполнения, а старые - по-прежнему со старой.

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

Примечание

Лучше избегать параллельного использования нескольких версий одной разделяемой библиотеки, поскольку все эти версии вместе могут потребовать больше дисковой и оперативной памяти, чем могло бы понадобится соответственной архивной (перемещаемой) версии.




Содержание раздела