Qual è il modo corretto per sostituire le parti molto piccole di un file binario a livello di programmazione?

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

Domanda

Ho un codice di gioco (dal progetto IOQUAKE3) che compila parte dei binari di gioco al volo (il sistema QVM). Ora, si potrebbe potenzialmente accelerarlo caricando binari precedentemente salvati di questa operazione (con qualsiasi precauzioni di cambio di file in atto).

Ma i suggerimenti per le funzioni salvati in questi binari non sono persistenti attraverso le sessioni.

Quale sarebbe il modo corretto per cambiare quelli al volo? (Considerando uno ha l'assemblatore e l'assemblaggio per esso disponibili nell'applicazione principale)

È stato utile?

Soluzione

Questo è praticamente ciò che fa un normale caricatore per gli eseguibili. Di solito funzionano archiviando una tabella dei luoghi ci sono riferimenti a indirizzi che dovranno essere modificati in base al momento in cui il file viene caricato. In genere, archiviano un indirizzo relativo in ciascuna di quelle posizioni, per caricare il file, si guarda la tabella e aggiungi l'indirizzo di carico di base a ciò che è in ciascuno di questi indirizzi e metti quel risultato in immagine come caricato in memoria.

Altri suggerimenti

Passa una tabella di puntatori della funzione pertinenti come parametro. In alternativa, è possibile che il codice generato si basi su un'area dati posizionata in una posizione fissa, rispetto al codice.

Ricordo quando stavo scherzando con questa roba, avrei impostato una pagina di memoria lettura/scrittura/eseguita, usavo il primo tempo per il codice generato e la seconda metà per i dati. Il codice, una volta ottenuto il controllo, sarebbe andato così:

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

...e così via.

Per il codice generato su larga scala, potresti voler archiviare come DLL a soffiata completa e utilizzare il trasferimento fornito dal sistema e i servizi di fissaggio degli indirizzi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top