Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование под Linux #4 (21-02-2002)


Служба Рассылок Subscribe.Ru

Здравствуйте дорогие подписчики рассылки "Программирование под Linux" !!!
 ....----==== http://linux.firststeps.ru/ ====----....

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

Сегодня поговорим о Библиотеках объектных файлов. Те кто регулярно
заходит на родительский сайт рассылки http://www.firststeps.ru
уже смог обнаружить обновления в разделе Linux. Те, кто этого не делают
будут просвящаться непосредственно из рассылки. Поехали...


Библиотеки объектных файлов
==============================

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

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

Объектные библиотеки по способу использования разделяются на два вида:
 * Статические библиотеки
 * Динамические библиотеки

  Статическая библиотека - это коллекция объектных файлов, которые присоединяются
к программе во время линковки программы. Таким образом статические библиотеки
используются только при созданиии программы. Потом в работе самой программы они
не принимают участие, в отличие от динамических библиотек.

  Динамическая библиотека - это созданная специальным образом библиотека, которая
присоединяется к результирующей программе в два этапа. Первый этап, это естественно
этап компиляции. На этом этапе линковщик встраивает в программу описания требуемых
функций и переменных, которые присутствуют в библиотеке. Сами объектные файлы из
библиотеки не присоединяются к программе. Присоединение этих объектных файлов(кодов
функций) осуществляет системный динамический загрузчик во время запуска программы.
Загрузчик проверяет все библиотеки прилинкованные с программе на наличие требуемых
объектных файлов, затем загружает их в память и присоединяет их в копии запущенной
программы, находящейся в памяти.

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

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


Создание статической библиотеки
===================================

  Для создания статических библиотек существует специальная простая программа
называемая ar (сокр. от archiver - архиватор). Она используется для создания,
модификации и просмотра объектных файлов в статических библиотеках, которые в
действительности представляют из себя простые архивы.

  Давайте вернемся к прошлому проекту и создадим из файлов f1.c и f2.c отдельную
библиотеку. Для начала компилируем эти файлы:

dron:/# gcc -c f1.c f2.c

  В результате получим, как обычно, два файла - f1.o и f2.o. Для того, чтобы
создать библиотеку из объектых файлов надо вызвать программу ar со следующими
параметрами:

ar rc libимя_библиотеки.a [список_*.o_файлов]

Допустим наша библиотека будет называться fs, тогда команда запишется в виде:

dron:/# ar rc libfs.a f1.o f2.o

В результате получим файл libfs.a, в котором будут лежать копии объектых
файлов f1.o и f2.o. Если файл библиотеки уже существует, то архиватор будет
анализировать содержимое архива, он добавит новые объектные файлы и заменит
старые обновленными версиями. Опция c заставляет создавать (от create)
библиотеку, если ее нет, а опция r (от replace) заменяет старые объектные
файлы новыми версиями.

Пока у нас есть лишь архивный файл libfs.a. Чтобы из него сделать полноценную
библиотеку объектных файлов надо добавить к этому архиву индекс символов, т.е.
список вложенных в библиотеку функций и переменных, чтобы линковка происходила
быстрее. Далается это командой:

ranlib libимя_библиотеки.a

Программа ranlib добавит индекс к архиву и получится полноценная статическая
библиотека объектных файлов. Стоит отметить, что на некоторых системах
программа ar автоматически создает индекс, и использование ranlib не имеет
никакого эффекта. Но тут надо быть осторожным при атоматической компиляции
библиотеки с помощью файлов makefile, если вы не будете использовать утилиту
ranlib, то возможно на каких-то системах библиотеки будут создаваться не верно
и потеряется независимость от платформы. Так что возьмем за правило тот факт,
что утилиту ranlib надо запускать в любом случае, даже если он нее нет
никакого эффекта.

Для компиляции нашего основного файла main.c надо сообщить компилятору, что
надо использовать библиотеки. Чтобы компилятор знал где искать библиотеки
ему надо сообщить каталог, в котором они содержатся и список этих билиотек.
Каталог с библиотеками указывается ключом -L, в нашем случае библиотека
находится в текущем каталоге, значит путь до нее будет в виде точки (-L.).
Используемые библиотеки перечисляются через ключ -l, после которого указывается
название библиотеки без префикса "lib" и окончания ".a". В нашем случае этот ключ
будет выглядеть, как -lfs. Теперь все одной командой:

dron:/# gcc -c main.c
dron:/# gcc main.o -L. -lfs -o rezult

Или можно чуть короче:

dron:/# gcc main.c -L. -lfs -o rezult

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

dron:/# gcc -c main.c -L. -lfs
gcc: -lfs: linker input file unused since linking not done

Что означает, что файлы библиотек не нужны, до процесса линковки. Данная
команда создаст лишь файл main.o, который в итоге потом придется собирать
отдельно.

===========================
   Полезные ссылки
===========================
Сайт Владимира Игнатова. Он является автором книги и переводчиком
документации для утилиты GNU Make, о которой мы с Вами будем говорить
в ближайшее время.
http://www.geocities.com/SiliconValley/Office/6533/

Присылайте свои "полезные ссылки", не забывайте, что они всем нужны.

============================================
Другие рассылки про Linux на Subscribe.RU
============================================
LinuxNews LinuxNews
  http://www.subscribe.ru/catalog/comp.soft.linux.linuxnews

LinuxRSP.Ru: новости, статьи, софт. Linux и Open Source
  http://www.subscribe.ru/catalog/comp.soft.linux

Новости свободно-распространяемых ОС (Linux, FreeBSD, OpenBSD и других)
  http://www.subscribe.ru/catalog/comp.soft.othos.freeos

Linux Gazette на русском
  http://www.subscribe.ru/catalog/comp.soft.linux.gazette


Количество подписчиков: 638

Выпуск подготовил: Кузин Андрей (dron@mjk.msk.ru)

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное