2008-12-03 7 views
3

Я всегда смущался о том, как работает компоновщик, и его трудно искать.Как работает базовый процесс ссылок для ELF и PE

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

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

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

Спасибо!

ответ

1

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

  • ар (1) используется для создания .a файлов. Они похожи на tar (1) или zip-файлы (возможно, с индексом для поиска объектного файла по имени символа)
  • Компилятор объединяет разделы объектных файлов (текст, данные, bss). Для GNU ld точное копирование разделов можно контролировать с помощью сценария компоновщика (например, скопировать все разделы из .o-файлов, содержащих «текст» в их именах, в один текстовый раздел)
  • В компоновщике также выполняются перестановки: инструкции по исправлению (скачок и загрузка данных) с соответствующими целевыми адресами, как только известно значение символа. В некоторых случаях это невозможно сделать во время связи, поэтому компоновщик копирует/настраивает записи перемещения из .o-файлов в окончательный исполняемый файл.
  • Windows .lib выполняет две задачи: статическая библиотека (.lib) похожа на библиотеки .a. Библиотека импорта (.lib) не содержит фактического кода, а только списки символов. Компонент может разрешать символы из библиотеки импорта, но затем знает, что ему нужно поместить ссылку на соответствующую .dll в исполняемый файл. В Unix/ELF файл .so имеет как код, так и таблицу символов.
+0

Отлично, что отвечает на все мои вопросы. Благодаря! :) – Nayruden 2008-12-03 17:27:30