Объектные библиотеки

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

Библиотека, как правило, представляет собой последовательный файл, со­стоящий из заголовка, за которым последовательно располагаются объект­ные модули. В заголовке содержится следующая информация.

□ Список всех объектных модулей, со смещением каждого модуля от нача­ла библиотеки. Смещение нужно для того, чтобы можно было легко най­ти требуемый модуль.

□ Список всех глобальных символов, определенных в каждом из модулей, с указанием, в каком именно мо­дуле он был определен.

Линкер обычно собирает в программу все объектные модули, которые были ему, заданы в ко­мандной строке, даже если на этот модуль не было ни одной ссылки. С библиотечными модулями он ве­дет себя несколько иначе.

Встретив ссылку на глобальный символ, компоновщик ищет опре­деление этого символа во всех мо­дулях, которые ему были заданы. Если там такого символа нет, то линкер ищет этот символ в заголов­ке библиотеки. Если его нет и там, компоновщик сообщает: "Не опре­делен символ SYMBOL", — и за­вершает работу. Некоторые редак­торы связей, правда, могут продолжить работу и даже собрать загружаемый модуль, но, как правило, таким модулем пользоваться нельзя, так как в нем содержится ссылка на некорректный адрес. Если же определение символа библиотеке есть, компоновщик "вытаскивает" соответствующий модуль и дальше работает так, будто этот модуль был задан ему наравне с остальными объектными файлами. Этот процесс повторяется до тех пор, пока не будут разрешены все глобальные ссылки, в том числе и те, которые возникли библиотечных модулях, или пока не будет обнаружен неопределенный сим­вол. Благодаря такому алгоритму в программу включаются только те модуль из библиотеки, которые нужны.

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