Linker (Link Editor)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 13:35, 2 июня 2017.
Linker (Link Editor)
Linker.png
Операционная система: Кросс-платформенное
Локализация: английский
Веб-сайт {{#property:P856}}

Linker - (англ. Link Editor - компоновщик, редактор связей или линкер) - это инструментальная программа в сфере разработки программного обеспечения, которая производит компоновку, то есть принимает на вход один или несколько объектных модулей и собирает по ним исполнительный модуль. Линковка это процесс компоновки различных кусков кода и данных вместе, в результате чего получается один исполняемый файл. Линковка может быть выполнена во время компиляции, во время загрузки (загрузчиком) и также во время исполнения (исполняемой программой). Раньше (конец 40-х) линковка выполнялась вручную, сейчас мы имеем программы линковщики (linkers), которые дают возможность динамической линковки разделяемых библиотек (shared libraries).

Обзор

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

  • Определённые или экспортируемые имена — функции и переменные, определённые в данном модуле и предоставляемые для использования другим модулям;
  • Неопределённые или импортируемые имена — функции и переменные, на которые ссылается модуль, но не определяет их внутри себя;
  • Локальные — могут использоваться внутри объектного файла для упрощения процесса настройки адресов

Для большинства компиляторов, один объектный файл является результатом компиляции одного файла с исходным кодом. Если программа собирается из нескольких объектных файлов, компоновщик собирает эти файлы в единый исполнимый модуль, вычисляя и подставляя адреса вместо символов, в течение времени компоновки (статическая компоновка) или во время исполнения (динамическая компоновка).[Источник 1]

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

Работа компоновщика заключается в том, чтобы в каждом модуле определить и связать ссылки на неопределённые имена. Для каждого импортируемого имени находится его определение в других модулях, упоминание имени заменяется на его адрес. Линкер также заботится о размещении объектов в программе в адресное пространство . Это может включать в себя перемещение кода, который принимает конкретный базовый адрес, в другую базу. Так как компилятор редко знает, где объект будет находиться, он часто предполагает фиксированную точку отсчета (например, ноль). Компоновщик обычно не выполняет проверку типов и количества параметров процедур и функций. Если надо объединить объектные модули программ, написанные на языках со строгой типизацией, то необходимые проверки должны быть выполнены дополнительной утилитой перед запуском редактора связей.

Динамическая компоновка

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

Такой подход дает два преимущества:

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

Есть и недостатки:

  1. Известная на платформе Microsoft Windows как «DLL Hell» несовместимая обновленная библиотека разрушает исполняемые файлы, которые зависели от поведения предыдущей версии библиотеки, если более новая версия не имеет обратной совместимости.
  2. Программа вместе с библиотеками, которые она использует, может быть сертифицирована (например, относительно правильности, требований к документации или производительности) в виде пакета, но не в случае замены компонентов. (Это также противоречит автоматическим обновлениям ОС в критических системах, в обоих случаях ОС и библиотеки являются частью квалифицированной среды.)[Источник 2]

Статическая компоновка

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

Релокация

После того как линковщик разрешил адресацию всех символов, каждая адресация символа ссылается ровно на одно определение символа. В этот момент линковщик запускает процесс релокации, состоящий из двух шагов:

Релокация секций и определения символов. Линковщик объединяет все секции одного типа в новую секцию. К примеру, линковщик объединяет все секции .data всех входных перемещаемых объектов в новую секцию .data результирующего исполняемого файла. Похожий процесс происходит для секции .code. Затем линковщик указывает текущий адрес памяти для этой сгенерированной секции. Так для каждой секции и символа. После завершения этого шага каждая инструкция и глобальная переменная в прогармме будет иметь уникальный адрес в момент загрузки. Релокация адресации символов внутри секций. На этом шаге линковщик изменяет адресации на символы в коде и секциях данных так, чтобы они указывали на корректный уникальный адрес в момент загрузки. Ассемблер при релокации создаёт секции .relo.text и .relo.data, в которых содержится информация как разрешить адресацию (адрес для обращения к символу). ELF содержит в секциях релокации следующие данные:

Загрузчик

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

Линковщики (linkers) и загрузчики (loaders) выполняют концептуально разные, но в целом похожие задачи. Загрузка программ - это копирование образа программы с жёсткого диска в RAM. В некоторых случаях загрузка программы (loading) также может включать выделение дисковой памяти или отображение виртульного адресного пространства на дисковое пространство. Программы имеют внутри себя множество подпрограмм; указание одной подпрограммы на другую подпрограмму происходит через символьные таблицы. Работа линковщика — подменять указания на символ подпрограммы на указание адреса расположения подпрограммы, изменяя объектный код.

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

Unix

В Unix загрузчик является обработчиком системного вызова execve(). Задачи загрузчика Unix включают:

  1. Проверка (разрешения, требования к памяти и т. Д.);
  2. Копирование образа программы с диска в оперативную память;
  3. Копирование аргументов командной строки в стеке;
  4. Инициализация регистров (например, указатель стека);
  5. Переход к точке входа программы (_start).

Microsoft Windows

В Microsoft Windows 7 и выше загрузчик - это функция LdrInitializeThunk, содержащаяся в ntdll.dll, которая выполняет следующие действия:

  1. Инициализация структур в самой DLL (то есть критические секции, списки модулей);
  2. Проверка корректности исполняемого файла;
  3. Создание кучи (с помощью функции RtlCreateHeap);
  4. Выделение блока переменных окружения и PATH;
  5. Добавление исполняемого файла и NTDLL в список модулей (двусвязный список);
  6. Загрузка KERNEL32.DLL для получения нескольких важных функций, например BaseThreadInitThunk;
  7. Загрузка имён исполняемого файла (т.е. Библиотек динамической компоновки).
  8. Инициализация DLL;

Редактор связей

В средах мэйнфреймов IBM System / 360, таких как OS / 360, включая z / OS для мейнфреймов z / Architecture, этот тип программы известен как редактор связей. Тем не менее, редактор связей, как следует из названия, имеет дополнительную возможность, позволяющую добавлять, заменять и / или удалять отдельные разделы программы. Операционные системы, такие как OS / 360, имеют разные форматы для исполняемых загрузочных модулей, поскольку они содержат дополнительные данные о компонентах разделов программы, так что отдельный раздел программы может быть заменен, а другие части программы обновлены так, что Перемещаемые адреса и другие подобные ссылки могут быть исправлены редактором связей как часть процесса.

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

Примечание: термин «редактор связей» не следует понимать как подразумевающий, что программа работает в интерактивном режиме пользователя (например, текстовый редактор). Он строго предназначен для выполнения в пакетном режиме, при этом команды редактирования предоставляются пользователем последовательно организованными записями, такими как носитель записи «единичная запись» (например, дека карт) или носитель DASD (например, файл на диске) , Но лента также поддерживается, и ленты часто использовались во время первоначальной установки ОС

С++

Редактор связей выполняет две функции. Во-первых, как можно заключить по его названию, он комбинирует (компонует, редактирует) различные объектные файлы. Вторая его функция — разрешать адреса вызовов и инструкций загрузки, найденных в редактируемых объектных файлах. Раздельная компиляция — это возможность, позволяющая разбить программу на несколько файлов, скомпилировать каждый из этих файлов отдельно, а потом скомпоновать их, чтобы в конечном итоге создать исполняемый файл. Результатом работы компилятора является объектный файл, а результатом работы редактора связей — исполняемый файл. Редактор связей физически связывает файлы, внесенные в список компоновки, в один программный файл и разрешает внешние ссылки. Внешняя ссылка создается каждый раз, когда программа из одного файла ссылается на код из другого файла. Это происходит при вызове функции и при ссылке на глобальную переменную. Например, при компоновке двух приведенных ниже файлов, должна быть разрешена ссылка в файле 1 . Редактор связей сообщает программе из файла 2 , где найти count .

  • Файл 1
  • int count;
  • void display(void);
  • int main(void)
  • {
  • count = 10;
  • display();
  • return 0;
  • }


  • Файл 2
  • #include <stdio.h>
  • extern int count;
  • void display(void)
  • {
  • printf("%d", count);
  • }

Аналогично, редактор связей укажет файлу 1 , где находится функция display(), чтобы можно было ее вызвать.

Приложения

Linker 2.3.1.17

Linker 2.3.1.17
Постоянный выпуск: 2.3.1.17
Операционная система: Windows XP/ Vista/ 7/ 8/ 8.1/ 10
Локализация: русский
Веб-сайт 193.106.30.70/programmy/40320-linker-23117-portableru.html

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

После запуска программы появится русскоязычный интерфейс.

Необходимо добавить нужные программы в список, установить порядок программ, перетаскивая значки программ мышкой. Таким образом, можно хранить набор своих программ в отдельной папке, а для работы с ними запускать Linker.

Linker «ест» очень мало ресурсов компьютера. Программа так же отслеживает запуск нескольких своих копий, то есть если случайно повторно ее запустить, то на экране появится ранее запущенная копия Linker, а «лишняя» автоматически закроется.

Linker 2.1.2.5

Linker 2.1.2.5
Постоянный выпуск: 2.1.2.5 / 2011
Операционная система: Windows ХР/Vista/Seven
Размер дистрибутива: 1,4 Мб
Локализация: русский
Веб-сайт optitrex.ru

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

USB флеш-брелки — все еще относительное новшество, они не так уж давно вошли в массовый обиход. Тем не менее, их популярность несравнима ни с какими другими носителями информации — из-за емкости, надежности, удобства в использовании и совместимости со всеми ПК. Именно благодаря их огромной вместимости (уступающей только портативным HDD) в мире софта появилась такая категория программ, как portable. То есть программ, приспособленных для запуска и работы непосредственно с USB - накопителя без необходимости установки.

Как результат, сегодня у многих квалифицированных пользователей (а тем более — у IТ-специалистов) имеются свои собственные подборки портативных приложений — тех, которые оказываются им нужны наиболее часто. При необходимости запустить ту или иную программу приходится открывать флешку, искать папку (порой вложенную еще в несколько подкаталогов), в ней искать исполняемый файл и запускать его. Программа Linker сильно упрощает задачу: она позволяет собрать все ссылки на нужные программы, файлы и папки в одном месте. То есть создать каталог всех нужных пользователю данных с непосредственными ссылками на них. В результате вызывать любую программу, добавленную в список, можно всего в один клик, без долгих поисков. Главное преимущество программы Linker — ее универсальность. Пользователь волен самостоятельно создавать собственные разделы, нужные только ему. То есть разработчики не предопределили никаких жестко прописанных разделов. Причем можно добавлять ссылки не только на portable-версии нужных программ, но и на любые другие файлы и даже папки без каких-либо ограничений. Более того, при желании Linker можно использовать на локальном жестком диске в качестве программы для быстрого запуска приложений и документов. Но все же главная задача Linker — «навести порядок» на флешке. Linker имеет весьма простой и скромный интерфейс. Отсутствие готовых предустановленных разделов позволяет настроить все создаваемые разделы под свои нужды. Linker не требует установки, достаточно просто распаковать его в любое место. При первом запуске рядом с исполняемым файлом программы появятся еще два файла, которые не следует удалять: в одном из них хранится информация обо всех добавленных ссылках, а во втором — настройки самого Linker'a. Данные хранятся в формате XML.

При первом запуске пользователь видит только небольшое пустое окошко с четырьмя кнопками вверху. Первая вызывает меню программы, вторая дает возможность добавлять новые записи в список, третья служит для редактирования уже добавленных ссылок, а последняя позволяет удалять их. Итак, начинаем с создания нужных разделов. Жмем кнопку «Добавить» и в появившемся меню выбираем пункт «Добавить группу». Появляется новое окошко, в которое следует ввести название и описание для создаваемой группы (описание не обязательно). Жмем кнопку ОК, и новая группа добавляется в список.

Понятно, что группы предназначены для размещения в них ссылок на программы или файлы. Чтобы поместить ссылку в группу, можно воспользоваться тем же меню «Добавить» (выбрать пункт «Добавить элемент»). Но можно действовать проще и быстрее: просто перетащить нужный файл в окно программы. Linker полностью поддерживает Drag&Drop, так что после перетаскивания нового элемента базовая информация о нем в виде ссылки и иконки будет автоматически добавлена в форму.

После этого пользователю остается только задать название, указать дополнительные параметры запуска новой программы и добавить ей описание. Есть один нюанс — для того, чтобы иметь возможность сворачивать разделы, следует все относящиеся к данному разделу программы просто перетащить на название нужной группы. После этого рядом с названием появится значок «+». Теперь, после нажатия на название группы или на плюсик, список будет раскрываться.

Перед выходом из программы необходимо сохранять изменения. Для этого потребуется зайти в меню «Доп. функции» и выбрать пункт «Сохранить конфигурацию». Поиск по фильтру. Если флешка большого объема и хранит много программ и файлов, их список может оказаться достаточно большим. Для облегчения работы с такими списками в программе присутствует функция фильтрации. Чтобы быстро найти нужный элемент, достаточно начать вводить его название. В ответ Linker выдаст список, в котором присутствуют только те записи, в которых встречается введенная пользователем комбинация символов. Чтобы вернуться к общему списку, достаточно убрать введенные символы клавишей Backspace.

Самый известный платный аналог Linker — это CodySafe ($9.90). Программа CodySafe интегрирована с онлайновой базой portable-софта. У Linker такой интеграции нет, однако пользователь может скачать с официального сайта небольшую подборку полезных утилит, названную «Быстрый старт». Из более-менее заметных преимуществ CodySafe перед Linker можно отметить разве что поддержку скинов.

Linker 2.1.1.8 Portable Rus

Linker 2.1.1.8 Portable Rus
Linker 2.1.1.8.jpg
Разработчики: DigitalGlyph Software
Постоянный выпуск: 2.1.1.8 Portable / 2011
Операционная система: Windows
Локализация: русский
Веб-сайт torrentino.me/torrent/829174

Возможности:

  • Поддержка путей с глобальными переменными. (Пример: system32cmd.exe).
  • Функция запуска программ от имени администратора.
  • Функция проверки новых версий на сайте и авто установки.
  • Поддержка отображения иконок для файлов со стандартными расширениями.
  • Интеллектуальный редактор добавляемых программ.
  • Добавление новых программ перетаскиванием из проводника.
  • Отображение программ в виде дерева.
  • Запуск программ двойным щелчком мыши или клавишей Enter.
  • Быстрый фильтр. Во время набора имени программы список отфильтровывается.
  • Сворачивание в системное меню (трей).
  • Автоматическое сворачивание/закрытие программы в системное меню (опционально).
  • Хранение описаний программ (для напоминания).
  • Горячие клавиши. Также для разворачивания из системного меню.
  • Подсветка всей группы с выделенной программой.
  • Изменение порядка и вложенности программ функцией Drag&Drop (перетаскивание мышью).
  • Сохранение позиции окна в зависимости от разрешения экрана.

Компоновщики

  • GNU linker— это GNU-реализация команды ld ОС UNIX. GNU ld запускает компоновщик, который создаёт исполнимый модуль (или библиотеку) из объектных модулей, созданных в процессе компиляции программного проекта. Для осуществления большего контроля над процессом компоновки GNU ld может быть передан linker script. GNU linker является частью пакета GNU Binary Utilities (binutils).[1]
  • gold — это компоновщик для ELF файлов. Он стал официальным пакетом GNU и был добавлен в binutils в марте 2008 года, а впервые выпущен в составе binutils версии 2.19. Gold был разработан Яном(Йеном) Лэнсом Тейлором и небольшой командой из Google. Мотивацией для написания gold было создание компоновщика, который является более быстрым, чем GNU linker, особенно для больших приложений, написанных на C++.[Источник 3]

Источники

  1. Linker (computing) // Wikipedia. [2016—2016]. Дата обновления: 05.09.2016. URL: https://en.wikipedia.org/wiki/Linker_(computing) (дата обращения: 26.05.2017)
  2. Компоновщик // Википедия. [2016—2016]. Дата обновления: 05.09.2016. URL: http://ru.wikipedia.org/?oldid=80638424 (дата обращения: 05.09.2016).
  3. Gold // Википедия. [2016—2016]. Дата обновления: 11.01.17. URL: https://wiki.archlinux.org/index.php/Gold_linker_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)

Ссылки

  1. Linker_(computing)
  2. Компоновщик
  3. Loader_(computing)
  4. Линковщики и Загрузчики
  5. Компоновщики и Загрузчики
  6. Редактор связей
  7. редактор связей
  8. Редактор связей
  9. Gold компоновщик
  10. Gold линкер
  11. GNU Linker
  12. GNU ld
    1. GNU linker // Википедия. [2016—2016]. Дата обновления: 31.10.2016. URL: http://ru.wikipedia.org/?oldid=81627932 (дата обращения: 31.10.2016).