Компоновщик: Как из кода получается программа
Часть 1: Что делает компоновщик
• Я начинаю новый цикл постов про то, что такое компоновщик и как он работает, если кому интересно, вот откуда я буду брать инфу - *тык*. Приятного чтения.
• Компоновщик (linker) — программа, которая превращает объектные файлы в исполняемые файлы или разделяемые библиотеки.
• Что это значит? При написании программы например на C ил C++, компилятор преобразует исходный код в промежуточный код, часто ассемблер. После чего ассемблер превращает ассемблерный код в объектный файл. (Некоторые компиляторы делают это напрямую)
• Раньше программы писали сразу на ассемблере, и ассемблер сразу генерировал исполняемый файл. Когда появились языки вроде Fortran и Cobol, появилась идея библиотек подпрограмм. Требовалось собирать итоговый файл из нескольких объектных, и это привело к появлению программы-компоновщика. Позже появилась поддержка разделяемых библиотек.
• Немного про разделяемые библиотеки. Разделяемые библиотеки (Shared libraries) — были придуманы как оптимизация для виртуальных ОС с многозадачностью. До разделяемых библиотек каждая программа содержала копию одного и того же кода, даже если базовый код использовался почти в каждой программе. Это привело к идее использовать систему виртуальной памяти, чтобы загружать одну копию и делиться ею между всеми процессами.
• Первая реализация появилась в SVR3 (формат COFF) — она просто выделяла каждому
.so определённый участок адресного пространства. Это не требовало серьёзных изменений в компоновщике, но было неудобно.• SunOS4 предложила более гибкий подход, позже перенятый в SVR4. Компоновка теперь частично происходила во время запуска программы. При старте исполнялся динамический компоновщик, связывающий программу с разделяемыми библиотеками. Прежний компоновщик стал называться статическим или программным. Статический компоновщик теперь должен был готовить информацию для динамического.
• Теперь вы знаете, что делает компоновщик, далее узнаем как именно он это делает. Удачи!
• Поддержать автора монеткой: @v_meshke
