Понятие компоновщика

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Максим

Понятие компоновщика

Непрочитанное сообщение Максим » 20 мар 2016, 22:32

Ребят. Не могу окончательно понять суть принцип действия компоновщика. Хочу выложить свое понимание о нем, и попросить вас редактировать его в правильном направлении.

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


Вот собственно эти правила я не очень понял. Помогите в более-менее краткой форме понять суть компоновщика. Заранее спасибо.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Понятие компоновщика

Непрочитанное сообщение Olej » 21 мар 2016, 03:03

Максим писал(а):Ребят. Не могу окончательно понять суть принцип действия компоновщика. Хочу выложить свое понимание о нем, и попросить вас редактировать его в правильном направлении.

Прочитав информацию на вашем сайте мое понимание о компоновщике сложилось таким образом:
Компоновщик необходим для составления программы в целом.То есть он объеденяет код других подпрограмм переходя по ссылкам составляя при этом общую картину программы. В программе находятся локальные, глобальные переменные, функции, процедуры и т.д(символы). Так вот, компилятор определяет сильные и слабые символы. И получается, что дальше компоновщик действует по таким правилам разрешения:
...
Главное назначение компоновщика: компоновать (собирать) единый большой проект из отдельно откомпилированных объектных модулей (после компилятора).
Для небольших программ, состоящих из одного файла кода (например, на C/C++) эта функция компоновщика не нужна.

Вторая функция компоновщика: настроить (привязать) относительные адреса в (бинарном) коде к адресам действительной загрузки программы. Но существуют и позиционно независимый код (PIC) который одинаково выполняется в любом месте загрузки.

Если бы не 1-я (главная) функция компоновщика, без этой 2-й можно бы было и обойтись ... поручив её компилятору, например.
Но если компоновка из частей испоьзуется почти повсеместно (кроме совсем учебных программ), то почему бы не передать ему и эту функцию?

Максим

Re: Понятие компоновщика

Непрочитанное сообщение Максим » 21 мар 2016, 03:18

Спасибо. С половиной вопроса я разобрался. А вот что касается сильных и слабых символов, определенных компилятором...Можете рассказать о них в кратце.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Понятие компоновщика

Непрочитанное сообщение Olej » 21 мар 2016, 17:42

Максим писал(а):Спасибо. С половиной вопроса я разобрался. А вот что касается сильных и слабых символов, определенных компилятором...Можете рассказать о них в кратце.
Где вы такого начитались?
Дайте ссылку - и я вам объясню что они имеют в виду.

Максим

Re: Понятие компоновщика

Непрочитанное сообщение Максим » 22 мар 2016, 02:30

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

Глобальные символы, определенные в модуле и упоминаемые в других модулях. В эту категорию попадают все нестатические функции и глобальные переменные.
Глобальные символы, упоминаемые во входном модуле, но определенные где-то в другом месте. Сюда относятся все функции и переменные, определенные с ключевым словом extern.
Локальные символы, определенные в самом модуле и упоминаемые лишь в нем. Сюда относятся все статические функции и статические переменные.
Компоновщик разрешает ссылки на символ, ассоциируя каждую ссылку в точности с одним определением символа, определенного в таблице символов какого-либо объектного файла из представленного списка перемещаемых объектных файлов. Разрешение локальных символов внутри модуля выполняется просто, ведь модуль не может иметь несколько определений одного и того же локального символа. Однако разрешение ссылок на глобальные символы происходит сложнее. В процессе компиляции компилятор отмечает каждый символ как сильный или как слабый. Функции и инициализированные глобальные переменные приобретают сильный вес, в то время как глобальные неинициализированные переменные - слабый. Теперь компоновщик разрешает символы по следующим правилам:

Не разрешено давать несколько сильных символов.
Если дан один сильный символ и несколько слабых символов, выбрать сильный символ.
Если дано несколько слабых символов, выбрать любой из слабых символов.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Понятие компоновщика

Непрочитанное сообщение Olej » 22 мар 2016, 13:15

Максим писал(а):Символы и разрешение символов
Я просил ссылку, а не пересказ своими словами этой глупости.
Максим писал(а): Однако разрешение ссылок на глобальные символы происходит сложнее. В процессе компиляции компилятор отмечает каждый символ как сильный или как слабый. Функции и инициализированные глобальные переменные приобретают сильный вес, в то время как глобальные неинициализированные переменные - слабый. Теперь компоновщик разрешает символы по следующим правилам:

Не разрешено давать несколько сильных символов.
Если дан один сильный символ и несколько слабых символов, выбрать сильный символ.
Если дано несколько слабых символов, выбрать любой из слабых символов.
Для вас важно то, что компоновщик разрешает адресные ссылки.
То как он это делает для вас не имеет никакого значения.
Возможно так, как описано в этой писуле. Возможно совсем не так. Возможно, это зависит от конкретного компилятора ... и, возможно, языка с которого делается компиляция.
Возможно, про какие-то сильные и слабые символы - придумал сам автор этого абзаца ... почему я и просил ссылку... уж очень описание напоминает пересказ "на пальцах".

Для вас, как потребителя, программиста, инженера и т.д. то как конкретно компоновщик разрешает адресные ссылки не имеет никакого значения.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Понятие компоновщика

Непрочитанное сообщение Olej » 22 мар 2016, 17:33

Максим писал(а):Символы и разрешение символов
В каждом перемещаемом объектном файле есть таблица символов и ассоциированные с ней символы. С точки зрения компоновщика, существуют следующие типы символов:
Посмотрел я откуда вы это взяли: Компоновщики и загрузчики. Часть 1 (или по другому адресу - переводов этой статьи множество). Это перевод с оригинала Linkers and Loaders ... в довольно научно-популярном журнале "Linux Journal"
Nov 26, 2002 By Sandeep Grover
Это 2002г. (14 лет назад!) и статья относилась к ядру Linux 2.2.16 ("когда Земля была ещё тёпленькая" :lol: ).

Не берите дурного голову. :-o

Максим

Re: Понятие компоновщика

Непрочитанное сообщение Максим » 22 мар 2016, 18:19

Тогда большущее вам спасибо. Вы мне очень помогли=)


Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Понятие компоновщика

Непрочитанное сообщение Olej » 01 апр 2016, 17:59

Что это было папа? :-o

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей