Обмен технологиями

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

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Компоновщик играет жизненно важную роль в разработке программ. Он отвечает за интеграцию нескольких объектных файлов и файлов библиотек в исполняемый файл. Прежде чем мы углубимся в то, как работает компоновщик, в разницу между статическим и динамическим связыванием, а также в то, как создавать и использовать библиотеки динамической компоновки, давайте сначала обрисуем основные функции компоновщика.

Как работает компоновщик

Линкер Это инструмент, отвечающий за объединение одного или нескольких объектных файлов и файлов библиотек в исполняемый файл. К его основным функциям относятся:

  1. Разбор символов : Идентифицировать и обрабатывать все символы (имена функций и переменных) в программе, гарантируя, что каждый символ имеет уникальное определение. Для символов, на которые имеются ссылки, но которые не определены (внешние символы), компоновщик ищет определение в предоставленной библиотеке или другом объектном файле.

  2. перезагрузить : Скорректируйте адреса кода и данных в каждом модуле в соответствии с конечным адресом памяти. Перемещение включает в себя коррекцию адреса в коде и корректировку положения сегмента данных, чтобы гарантировать, что все ссылки указывают на правильную ячейку памяти.

  3. объединить сегменты: объединить сегменты одного типа (например, сегменты кода, сегменты данных и т. д.) из разных целевых файлов в один непрерывный сегмент.

  4. библиотека обработки : Свяжите код библиотеки, необходимый программе, с объектным файлом. Компоновщик может обрабатывать два типа библиотек: статические библиотеки и динамические библиотеки.

  5. Создать исполняемый файл: Конечным результатом является исполняемый файл, который можно запустить в операционной системе.

Разница между статическим связыванием и динамическим связыванием

Статическое связывание иДинамическое связывание Это два режима работы компоновщика, каждый из которых имеет разные характеристики и сценарии использования.

статическая ссылка
  • концепция : при статическом связывании код библиотеки копируется во время компиляции и встраивается в каждый исполняемый файл, который его использует. Таким образом, сгенерированный исполняемый файл содержит весь необходимый код и не зависит от файлов внешних библиотек.

  • преимущество

    • Полная независимость: сгенерированный исполняемый файл содержит все зависимости и не требует дополнительных файлов библиотеки во время выполнения.
    • Хорошая совместимость: среда выполнения не зависит от версии библиотеки, установленной в системе, и не возникает проблемы «конфликта версий библиотеки».
  • недостаток

    • Большой размер файла: каждый исполняемый файл содержит полный библиотечный код, что приводит к увеличению размера файла.
    • Проблема с обновлением: если библиотека обновлена, все программы, использующие ее, необходимо перекомпилировать.
  • Расширение статической библиотеки

    • Окна: .lib
    • Unix/Linux: .a
динамическая ссылка
  • концепция : при динамическом связывании код библиотеки загружается во время выполнения и не внедряется в исполняемый файл. Исполняемый файл содержит только ссылки на библиотеки, а код библиотеки загружается операционной системой во время выполнения.

  • преимущество

    • Небольшой размер файла: исполняемый файл не содержит кода библиотеки, только ссылки на библиотеку.
    • Легко обновляется: Обновление библиотек не требует перекомпиляции программы, достаточно замены файлов библиотеки.
    • Высокая эффективность использования памяти: несколько программ могут совместно использовать экземпляры памяти одного и того же файла библиотеки, что снижает использование памяти.
  • недостаток

    • Сильные зависимости: исполняемый файл должен иметь возможность находить и загружать правильную версию файла библиотеки при запуске.
    • Проблемы совместимости: несоответствие версии файла библиотеки может привести к сбою программы.
  • Расширение динамической библиотеки

    • Окна: .dll(Динамическая библиотека)
    • Unix/Linux: .so(Общий объект)

Создание и использование динамически подключаемых библиотек

Создать динамическую библиотеку

В разных операционных системах методы создания динамически подключаемых библиотек немного отличаются. Вот некоторые общие шаги и команды:

Создайте динамическую библиотеку в Linux.
  1. Написать код библиотеки

    Создайте исходный файл C, содержащий функции, которые мы хотим поместить в динамическую библиотеку.

    // example.cpp
    #include