Сборка программ. Объектный модуль



Сборка программ

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

 

Объектный модуль

В большинстве современных языков программирования программа состоит из отдельных слабо связанных модулей. Как правило, каждому такому модулю соответствует отдельный файл исходного текста. Эти файлы независимо обрабатываются языковым процессором (компилятором), и для каждого из них генерируется отдельный файл, называемый объектным модулем. Затем запускается программа, называемая редактором связей, компоновщиком или линкером (linker - тот, кто связывает), которая формирует из заданных объектных модулей цельную программу (осуществляет процесс сборки или связывания программы).

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

Типичный объектный модуль содержит следующие структуры данных:

1)таблицу перемещений, т.е. таблицу ссылок на перемещаемые объекты внутри модуля

2)таблицу ссылок на внешние объекты. Иногда это называется таблицей или списком импорта

3)таблицу объектов, определенных здесь, на которые можно ссылаться из других модулей. Иногда ее называют списком экспорта. Иногда эту таблицу объединяют с предыдущей и называют все это таблицей глобальных символов. В этом случае для каждого символа приходится указывать, определен он в данном модуле или нет, а если определен, то как

4)различную служебную информацию, такую, как имя модуля, программу, которая его создала

5)отладочную информацию

6)собственно код и данные модуля.


Сборка программ. Библиотеки объектных модулей.

Сборка программ

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

 

Библиотеки объектных модулей

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

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

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

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

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

 

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


Дата добавления: 2018-05-09; просмотров: 1472; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!