Как работает базовый процесс компоновки для ELF и PE

StackOverflow https://stackoverflow.com/questions/337659

Вопрос

Меня всегда смущало, как работает компоновщик, и это сложный объект для поиска.

Чтобы продемонстрировать свой вопрос и обеспечить основу для ответа, я опишу то, что я знаю (или думаю, что знаю) на данный момент.Возможно, я сильно ошибаюсь.:)

Во-первых, каждый файл .cpp встроен в промежуточный файл (.o для Posix / ELF и .obj для Win / PE, я полагаю).Этот промежуточный файл содержит все символы, определенные в .cpp, из которого он был создан, и содержит инструкции о том, по каким внешним ссылкам он должен быть правильно разрешен.В качестве расширения к этому системы Posix позволяют объединять файлы .o в файл .a (который, похоже, не делает ничего большего, чем объединение?Какая команда это делает?).Является ли .lib Win / PE эквивалентом файла Posix .a в Win / PE?

Затем промежуточные файлы соединяются вместе, устраняются внешние зависимости, и у вас есть свой исполняемый файл.Я пропустил какие-то шаги?

Спасибо!

Это было полезно?

Решение

Вот несколько кусочков головоломки:

  • ar(1) используется для создания файлов .a.Они похожи на tar (1) или zip-файлы (возможно с индексом для поиска объектного файла по имени символа)
  • Компоновщик копирует вместе разделы объектных файлов (текст, данные, bss).Для GNU ld точным копированием разделов можно управлять с помощью скрипта компоновщика (напримерскопируйте все разделы из файлов .o, содержащих "текст" в своих названиях, в один текстовый раздел)
  • Компоновщик также выполняет перемещения:инструкции по исправлению (переход и загрузка данных) с соответствующими целевыми адресами, как только значение символа известно.В некоторых случаях это невозможно сделать во время компоновки, поэтому компоновщик копирует / корректирует записи перемещения из файлов .o в конечный исполняемый файл.
  • windows .библиотека служит двум целям:статическая библиотека (.lib) похожа на библиотеки .a.Библиотека импорта (.lib) не содержит фактического кода, а только списки символов.Компоновщик может разрешить символы из библиотеки импорта, но затем знает, что ему нужно поместить ссылку на соответствующий .dll в исполняемый файл.В Unix / ELF файл .so содержит как код, так и таблицу символов.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top