Как каждый процесс может иметь свою собственную копию глобальных данных в общей библиотеке - PullRequest
0 голосов
/ 23 февраля 2019

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

1 Ответ

0 голосов
/ 27 февраля 2019

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

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

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

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

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

Для основного исполняемого файла:ответ - «Копировать перемещения».

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

...