Выбор ответа Middle Сборка и линковка обновлено

Статическая или динамическая библиотека

Вопрос

Что верно для динамической библиотеки (.so) по сравнению со статической (.a)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Код загружается при запуске, его можно обновить без пересборки при совместимом ABI. Динамическая библиотека подгружается загрузчиком (ld.so) при старте или через dlopen, её страницы кода общие для процессов.

Варианты ответа

  1. Код загружается при запуске, его можно обновить без пересборки при совместимом ABIправильный ответ
  2. Код копируется в бинарник при линковке, поэтому бинарник получается больше
  3. Не требует поиска при запуске: путь к .so жёстко зашит в бинарник
  4. Работает быстрее во всех случаях, так как код разделяется между процессами

Разбор

Динамическая библиотека подгружается загрузчиком (ld.so) при старте или через dlopen, её страницы кода общие для процессов. Обновление без пересборки возможно, если не сломан ABI (раскладка классов, сигнатуры, версии символов).

  • Копирование кода в бинарник это статическая линковка.
  • Поиск идёт по rpath, LD_LIBRARY_PATH и системным путям, отсюда ошибки «cannot open shared object file».
  • Вызовы через PLT и позиционно-независимый код иногда даже чуть медленнее.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.