Для поддержания совместимости версий библиотеки можно предпринимать следующие действия.
• Добавлять новые функции под другими именами, а не изменять определения или интерфейсы существующих функций.
• При изменении определений экспортированных структур элементы следует добавлять только в конец структур и сделать дополнительные элементы необязательными либо заполняемыми самой библиотекой. Не расширяйте структуры, распределяемые за пределами библиотеки. В противном случае приложения не смогут распределить правильный объем памяти. Не расширяйте структуры, используемые в массивах.
8.4. Сборка совместно используемых библиотек
Если вы разобрались с концепцией имен soname, все остальное просто. Достаточно следовать нескольким несложным правилам, которые перечислены ниже.
• Собирайте свой исходный код с указанием флага -fPIC
для gcc
. В результате сгенерируется независимый от места расположения код, который можно компоновать и загружать по любому адресу [13] Разница между -fPIC и -fpic заключается в способе генерации независимого от расположения кода. В некоторых архитектурах с помощью -fpic можно собрать только относительно небольшие совместно используемые библиотеки, тогда как в других эти флаги дают один и тот же эффект. Если только нет веских причин на обратное, лучше использовать -fPIC вместо -fpic , тогда все будет работать должным образом во всех архитектурах.
.
• Не используйте опцию компилятора -fomit-frame-pointer
. Библиотеки по-прежнему будут работать, но отладчики станут бесполезными. Если в библиотеке будет найдена ошибка, пользователь не сможет осуществить обратную трассировку ошибки в коде.
• При компоновке библиотеки используйте gcc
вместо ld
. Компилятору С известно, как вызывать загрузчик для правильной компоновки, к тому же нет никакой гарантии, что интерфейс для ld
останется неизменным.
• При компоновке библиотеки не забывайте предоставлять имя soname. Для этого используется специальная опция компилятора -Wl
. Для сборки своей библиотеки используйте команду
gcc -shared -Wl, -soname, soname -о libname filelist liblist
где soname
— имя soname, libname
— имя библиотеки, включая полное имя версии, например, libc.so.5.3.12
, filelist
— список объектных файлов, которые нужно разместить в библиотеке, a liblist
— список других библиотек, предоставляющих символы, к которым будет получать доступ эта библиотека. Последний элемент очень легко пропустить, поскольку без него библиотека будет работать в системе, в которой она создана, но может не работать в других ситуациях. Практически для любой библиотеки в список следует включать библиотеку С, поместив -lс
в конце списка.
Чтобы создать файл libfоо.so.1.0.1
с soname-именем libfоо.so.1
из объектных файлов fоо.о
и bar.о
, используйте следующую команду:
gcc -shared -Wl,-soname,libfoo.so.1 -о libfoo.so.1.0.1 foo.o bar.о -lc
• He разбивайте на полосы библиотеку, если только не сталкиваетесь с окружением, где пространство ограничено. Разбитые на полосы библиотеки будут функционировать, но будут иметь такие же основные недостатки, что и библиотеки, собранные из объектных файлов, скомпилированных с -fomit-frame-pointer
.
8.5. Инсталляция совместно используемых библиотек
Программа ldconfig
выполняет всю рутинную работу по инсталляции совместно используемых библиотек. Вам всего лишь нужно получить файлы и запустить ldconfig
. Выполните описанные ниже шаги.
1. Скопируйте совместно используемую библиотеку в каталог, в котором она должна быть сохранена.
2. Если нужно, чтоб компоновщик смог найти библиотеку без указания ее с помощью флажка -L библиотека
, инсталлируйте библиотеку в /usr/lib
или создайте символическую ссылку в /usr/lib
по имени имя_библиотеки .so
, которая указывает на файл совместно используемой библиотеки. Вы должны использовать относительную символическую ссылку (когда /usr/lib/libc.so
указывает на ../../lib/libc.so.5.3.12
), а не абсолютную (когда /usr/lib/libc.so
указывает на /lib/libc.so.5.3.12
).
3. Если нужно, чтобы компоновщик смог обнаружить библиотеку без ее инсталляции в системе (или до ее инсталляции), создайте ссылку имя_библиотеки .so
в текущем каталоге. Затем используйте -L.
, чтоб указать gcc
на поиск библиотек в текущем каталоге.
4. Если полный путь к каталогу, в который вы инсталлировали файл совместно используемой библиотеки, не перечислен в /etc/ld.so.conf
, добавьте его в этот файл, указав в отдельной строке.
Читать дальше