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