Разрешение символов и динамическое связывание - PullRequest
0 голосов
/ 21 мая 2018

Я читал о процессе перемещения и разрешения символов, и у меня есть несколько вопросов по этому поводу.

Таким образом, весь процесс (загрузки exec) начинается с команды exec(BA_OS).В течение exec(BA_OS) система извлекает имя пути из сегмента PT_INTERP и создает начальный образ процесса из сегментов файла интерпретатора.То есть вместо использования изображений сегментов исходного исполняемого файла система создает образ памяти для интерпретатора.В этом случае переводчик несет ответственность за получение контроля от системы и обеспечение среды для прикладной программы.

После этого динамический компоновщик выполняет следующие действия (если LD_BIND_NOW имеет ненулевое значение):

  • Добавление сегментов памяти исполняемого файла к образу процесса;
  • Добавление сегментов памяти совместно используемого объекта к образу процесса;
  • Выполнение перемещений для исполняемого файла и его общего ресурсаobjects;
  • Закрытие файлового дескриптора, который использовался для чтения исполняемого файла, если он был передан динамическому компоновщику;
  • Передача управления программе, чтобы она выглядела так, как будто программа имелаПолучил контроль непосредственно от exec(BA_OS).

Итак, мой вопрос сейчас

1.Когда эти общие объекты загружаются в память?

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

2.Как динамический компоновщик получает адрес для исправления записи GOT символа?

Ниже описано, что происходит (или что я знаю, что происходит), когда функция вызывается впервые.

  • Перейти к записи PLT нашего символа.
  • Перейти к записи GOT нашего символа.
  • Перейти к записи PLT и нажатьсмещение в стеке.То, что смещение на самом деле является структурой Elf_Rel, описывающей, как исправить символ.
  • Перейти к записи заглушки PLT.
  • Вставить указатель на структуру link_map (в другой статье этобыл указателем на таблицу перестановок), чтобы компоновщик мог найти, к какой библиотеке принадлежит символ.
  • Вызвать динамический компоновщик.
  • Исправить запись GOT.

Что делает динамический компоновщик, когда он вызывается?Как он использует элементы в стеке (смещение и указатель) для исправления записи GOT?Предположим, что существует большое количество файлов .so, и есть ли порядок, в котором динамический компоновщик просматривает эти файлы?


Я только начал изучать этот материал.Пожалуйста, поправьте меня, если мое понимание неверно.Если вам известны какие-либо другие полезные ресурсы, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...