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