Операционная система 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) см. также в Справочнике пользователя.




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