Как работает базовый процесс связи для ELF и PE - PullRequest
3 голосов
/ 03 декабря 2008

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

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

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

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

Спасибо!

1 Ответ

1 голос
/ 03 декабря 2008

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

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