2015-11-10 3 views
1

Я хотел бы перевести делегатов .ptr и .funcptr на абсолютный адрес, который соответствует чему-то в исполняемом изображении в DRAM.Как перевести делегат на абсолютный адрес в DRAM?

Цель состоит не в вызове, а в изменении, а в том, чтобы позволить цели разобраться во время выполнения, когда его собственное изображение загружается в DRAM.

До сих пор он уже работает с глобальными функциями.

Возможно ли это?

+0

В физической памяти или только в памяти процесса? –

+0

Вы можете просто установить указатели на адрес, используя приведения, если необходимо, чтобы сообщить системе типов, что вы знаете, что вы делаете. ... но вы уверены, что знаете, что делаете? Делегат работает определенным образом, что, вероятно, не соответствует случайному адресу. Указатель функции может быть более уместным, но idk - только то, что вам нужно сделать. –

+0

@ratchetfreak: да, в ОЗУ –

ответ

3

Адрес делегата - это значение свойства .funcptr. Тип этого свойства немного вводит в заблуждение - он имеет тип function и делает не содержит список скрытых аргументов, которые фактически ожидаются для передачи контекста, но для получения адреса вы можете игнорировать тип (явно листинг на void* или size_t, если вы хотите изменить тип) и просто посмотрите адрес.

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