2010-03-07 1 views
1

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

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

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

+0

Какая ОС? ответы, скорее всего, будут специфичными для ОС. –

+0

Я понимаю, что вы хотите отредактировать двоичный файл, но я не уверен в остальном вопросе. Почему в первую очередь меняются указатели? И как вы знаете, какие изменения сделать без повторной компиляции? Возможно, я что-то пропустил, но я просто не понимаю вашу проблему полностью. – zdav

ответ

2

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

2

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

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

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-файлов и воспользоваться услугами по переустановке и исправлению адресов в системе.