Quelle est la bonne façon de remplacer des parties très petites d'un fichier binaire programme?

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

Question

J'ai un code de jeu (du projet ioquake3) qui compile une partie des binaires de jeu à la volée (le système QVM). Maintenant, on pourrait accélérer potentiellement vers le haut en chargeant les binaires précédemment enregistrés de cette opération (avec toutes les précautions de changement de fichiers en place).

Mais, des pointeurs vers des fonctions enregistrées dans ces binaires ne sont pas persistants à travers des sessions.

Quelle serait la bonne façon de changer les à la volée? (En considérant une a l'assembleur et l'assemblage de la disposition dans l'application principale)

Était-ce utile?

La solution

C'est à peu près ce que un chargeur normal pour executables fait. Ils travaillent habituellement en stockant une table des endroits, il y a des références à des adresses qui devront être modifiées en fonction de l'endroit où le fichier est chargé. En règle générale, ils stockent une adresse relative dans chacun de ces endroits, afin de charger le fichier, vous regardez la table et ajoutez l'adresse de chargement de base à ce qui est à chacune de ces adresses, et de mettre ce résultat dans l'image comme chargée en mémoire.

Autres conseils

Passez une table de pointeurs de fonctions pertinentes en tant que paramètre. Vous pouvez avoir le code généré appuyer sur une zone de données qui est placé à un fixe, par rapport au code, emplacement.

Je me souviens quand je déconner avec ce genre de choses, je mis en place une lecture / écriture / exécution page de mémoire, utilisez la première moitié pour le code généré, et la seconde moitié des données. Le code, une fois qu'il a pris le contrôle, irait comme ceci:

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

... et ainsi de suite.

Pour grande échelle du code généré, vous pouvez le stocker sous forme DLL complète soufflés et utiliser la réinstallation fournies par le système et l'adresse des services fixup.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top