Что делает линкер?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что делает линкер?
Линкер (компоновщик) — это инструмент, который преобразует скомпилированные объектные файлы в исполняемый файл или библиотеку. Это критически важный этап в процессе создания программы на C/C++.
Основные функции линкера
1. Объединение объектных файлов
Линкер берёт несколько объектных файлов (.o на Linux/Mac, .obj на Windows) и объединяет их в один. Каждый .o файл содержит машинный код функций и переменных из одного .cpp файла.
// main.cpp
extern int add(int a, int b);
int main() {
int result = add(5, 3);
return result;
}
// math.cpp
int add(int a, int b) {
return a + b;
}
Компилятор создаст main.o и math.o, а линкер их соединит.
2. Разрешение символов (Symbol Resolution)
Когда компилятор встречает неизвестный символ (функцию, переменную), он создаёт ссылку на этот символ. Линкер ищет определение этого символа в других объектных файлах или библиотеках:
- Внутренние символы — функции из других .o файлов
- Внешние символы — функции из стандартной библиотеки (printf, malloc и т.д.)
- Статические библиотеки (.a, .lib) — линкер ищет нужные объекты внутри архива
- Динамические библиотеки (.so, .dll) — линкер добавляет информацию для загрузки во время выполнения
3. Переадресация адресов (Relocation)
В исходных объектных файлах адреса условные. Линкер переадресует все адреса на их окончательные позиции в исполняемом файле.
4. Управление секциями
Линкер объединяет одноименные секции из разных файлов:
- .text — код
- .data — инициализированные переменные
- .bss — неинициализированные переменные
- .rodata — константные строки
Ошибки линкера
Undefined reference — символ не определён нигде. Multiple definition — символ определён несколько раз.
Примеры команд
g++ main.cpp math.cpp -o program
g++ -c main.cpp -o main.o
g++ main.o math.o -o program
g++ main.o math.o -lm -o program
Динамическая vs Статическая линковка
Статическая — весь код встраивается в исполняемый файл. Большой размер, но нет зависимостей.
Динамическая — информация о загрузке библиотеки. Меньший размер, но библиотека должна быть при запуске.
Линкер — это критический мост между компилятором и операционной системой.