Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

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

/lib/libc.so.6
, даже если этот файл существует. Программа
ldconfig
, стандартная системная утилита, создает символическую ссылку
/lib/libc.so.6
(soname) на
/lib/libc-2.3.2.so
, действительное имя библиотеки.

В результате упрощается модернизация совместно используемых библиотек. Для обновления версии 2.3.2 до 2.3.3 потребуется всего лишь скопировать новую версию

libc-2.3.3.so
в каталог
/lib
и запустить
ldconfig
.
ldconfig
просматривает все библиотеки с soname, равным
libc.so.6
,
и создает символическую ссылку из soname на самую новую библиотеку, включающую это soname. Затем все приложения, скомпонованные с
/lib/libc.so.6
, автоматически используют новую библиотеку при последующих запусках, a
/lib/libc-2.3.2.so
можно смело удалить, поскольку потребность в ней полностью отпадает.

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

– lимя_библиотеки
компилятора или компоновщика. Таким образом, вы никогда не скомпонуете по ошибке приложение с неправильной версией. Компоновщик всегда будет искать файл
libимя_библиотеки.so
, который будет символической ссылкой на новую версию библиотеки.

Итак, для компоновки с библиотекой С компоновщик находит

/usr/lib/libc.so
, указывающую на то, что нужно использовать
/lib/libc.so.6
, который является ссылкой на
/lib/libc-2.3.2.so
. Приложение компонуется с soname-именем libc-2.3.2.so —
libc.so.6
, и при запуске оно находит
/lib/libc.so.6
и связывается с
libc-2.3.2.so
, поскольку
libc.so.6
является символической ссылкой на
libc-2.3.2.so
.

8.3.2. Несовместимые библиотеки

Если новая версия библиотеки не должна быть совместимой с предшествующими ее версиями, ей потребуется присвоить другое имя soname. Например, для выпуска новой версии библиотеки С, не совместимой со старой версией, разработчики использовали soname

libc.so.6
вместо
libc.so.5
. В результате делается акцент на несовместимости, а приложения, скомпонованные с разными версиями библиотеки, могут сосуществовать в одной системе. Приложения, скомпонованные с одной из версий
libc.so.5
, будут продолжать использовать последнюю версию библиотеки с soname
libc.so.5
, а приложения, скомпонованные с одной из версий
libc.so.6
, будут работать с последней версией библиотеки, соответствующей soname
libc.so.6
.

8.3.3. Разработка совместимых библиотек

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

1. Изменение или удаление интерфейсов экспортированных функций.

2. Изменение экспортированных элементов данных, исключая добавление необязательных элементов в конец структур, размещенных внутри библиотеки.

3. Изменение поведения функций, выходящее за пределы первоначальной спецификации.

Для поддержания совместимости версий библиотеки можно предпринимать следующие действия.

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

• При изменении определений экспортированных структур элементы следует добавлять только в конец структур и сделать дополнительные элементы необязательными либо заполняемыми самой библиотекой. Не расширяйте структуры, распределяемые за пределами библиотеки. В противном случае приложения не смогут распределить правильный объем памяти. Не расширяйте структуры, используемые в массивах.

8.4. Сборка совместно используемых библиотек

Если вы разобрались с концепцией имен soname, все остальное просто. Достаточно следовать нескольким несложным правилам, которые перечислены ниже.

• Собирайте свой исходный код с указанием флага

– fPIC
для
gcc
. В результате сгенерируется независимый от места расположения код, который можно компоновать и загружать по любому адресу [13] .

• Не

используйте опцию компилятора
– fomit-frame-pointer
. Библиотеки по-прежнему будут работать, но отладчики станут бесполезными. Если в библиотеке будет найдена ошибка, пользователь не сможет осуществить обратную трассировку ошибки в коде.

13

Разница между

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

• При компоновке библиотеки используйте

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
).

Поделиться:
Популярные книги

Черный дембель. Часть 5

Федин Андрей Анатольевич
5. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 5

30 сребреников

Распопов Дмитрий Викторович
1. 30 сребреников
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
5.00
рейтинг книги
30 сребреников

Жребий некроманта 2

Решетов Евгений Валерьевич
2. Жребий некроманта
Фантастика:
боевая фантастика
6.87
рейтинг книги
Жребий некроманта 2

Охота на разведенку

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
6.76
рейтинг книги
Охота на разведенку

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Возвышение Меркурия. Книга 4

Кронос Александр
4. Меркурий
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Возвышение Меркурия. Книга 4

Надуй щеки! Том 3

Вишневский Сергей Викторович
3. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки! Том 3

Идеальный мир для Лекаря 16

Сапфир Олег
16. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 16

По воле короля

Леви Кира
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
По воле короля

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Он тебя не любит(?)

Курсант: назад в СССР 9

Дамиров Рафаэль
9. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: назад в СССР 9

Штуцер и тесак

Дроздов Анатолий Федорович
1. Штуцер и тесак
Фантастика:
боевая фантастика
альтернативная история
8.78
рейтинг книги
Штуцер и тесак

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

Хозяйка дома в «Гиблых Пределах»

Нова Юлия
Любовные романы:
любовно-фантастические романы
5.75
рейтинг книги
Хозяйка дома в «Гиблых Пределах»