Как каждый процесс может иметь свою собственную копию глобальных данных в общей библиотеке

Я понимаю, что из-за того, что разделяемые библиотеки не знают, где они будут размещены динамическим загрузчиком, они должны полагаться на GOT для разрешения всех ссылок на глобальные данные. Например, общая библиотека имеет глобальную переменную с именем globe, возможный способ доступа к такой переменной будет что-то вроде этого mov eax,DWORD PTR [ecx-0x10], при условии, что ecx содержит адрес GOT и смещение globe является 0x10, Теперь предположим, что процесс A использует эту общую библиотеку, за которой сразу следует процесс B. Я знаю, что код общей библиотеки может быть разделен между процессами, но данные не могут, поскольку каждый процесс может потенциально изменять данные в зависимости от его выполнения. Таким образом, каждый процесс получит свой собственный GOT, что означает, что благодаря виртуальной памяти адрес ecx + 0x10 будет указывать на два разных GOT в зависимости от того, какой процесс выполняет этот кусок кода. Но затем, скажем, один из процессов загружает вторую совместно используемую библиотеку с другим глобальным элементом данных со смещением 0x10 в своем ПОЛУЧЕНО. Как именно процесс, использующий две библиотеки, может получить доступ к глобальным данным каждой библиотеки, если они находятся по одному и тому же виртуальному адресу?

1 ответ

Но затем, скажем, один из процессов загружает вторую общую библиотеку с другим глобальным элементом данных со смещением 0x10 в GOT. Как именно процесс, использующий две библиотеки, может получить доступ к глобальным данным каждой библиотеки, если они находятся по одному и тому же виртуальному адресу?

Ответ состоит из трех частей:

  1. Как каждая библиотека получает доступ к своим глобальным переменным?
  2. Как каждая библиотека получает доступ к глобальным переменным других библиотек?
  3. Как основной исполняемый файл имеет доступ к глобальным переменным из любой библиотеки?

Лучший способ понять это - скомпилировать две тривиальные библиотеки и основной двоичный файл, а затем изучить различные GOT разделы и наблюдать, когда они меняются и каким образом.

Корень вашей путаницы заключается в том, что предполагается, что существует только один GOT, Это не так: каждая библиотека будет иметь свою собственную .got раздел, и компилятор и загрузчик времени выполнения устроит это так, чтобы ecx указывает на право .got,

Для основного исполняемого файла ответ - "перемещение копий".

Вот хорошая статья на эту тему.

Другие вопросы по тегам