Какой правильный способ программно заменить очень маленькие порции двоичного файла?

StackOverflow https://stackoverflow.com/questions/2395077

Вопрос

У меня есть код игрового кода (из проекта IOQuake3), который компилирует часть игровых двоичных файлов на лету (система QVM). Теперь можно потенциально ускорить его, загружая ранее сохраненные двоичные файлы этой операции (с любым изменением файлов мер предосторожности на месте).

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

Что было бы правильным способом изменить их на лету? (Рассматривая у одного есть ассемблер и сборка для него в основном приложении)

Это было полезно?

Решение

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

Другие советы

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

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

call l
l:
pop eax ; eax has the current eip
and eax, 0fffff000h ;round down to the page size, 4K AKA 0x1000
add eax, 800h ;now eax points at the data area

...и так далее.

Для среднего сгенерированного кода вы можете хранить его как полноценные DLL-дюймы и использовать System Projection Relection и Services Services.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top