Как работает базовый процесс компоновки для ELF и PE
-
22-07-2019 - |
Вопрос
Меня всегда смущало, как работает компоновщик, и это сложный объект для поиска.
Чтобы продемонстрировать свой вопрос и обеспечить основу для ответа, я опишу то, что я знаю (или думаю, что знаю) на данный момент.Возможно, я сильно ошибаюсь.:)
Во-первых, каждый файл .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 содержит как код, так и таблицу символов.