Qual é a forma correta para substituir porções muito pequenas de um arquivo binário através de programação?

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

Pergunta

Eu tenho um código de jogo (a partir de ioquake3 projeto) que compila parte da jogabilidade binários on the fly (a qvm sistema).Agora, alguém poderia, potencialmente, aumentar a velocidade dele carregando salvo anteriormente binários desta operação (com qualquer alteração de arquivos de precauções no lugar).

Mas, ponteiros para funções guardadas nestes binários não são persistentes através de sessões.

Qual seria a maneira correta de alterar os na mosca?(considerando um tem o montador e a montagem de ti disponíveis no aplicativo principal)

Foi útil?

Solução

É muito bonito o que um normal carregador para executáveis não.Eles geralmente trabalham armazenando uma tabela com os lugares, há referências a endereços que terá de ser alterado com base no local onde o arquivo é carregado.Normalmente, eles armazenam um endereço relativo em cada um desses locais, para carregar o arquivo, você olha a tabela e adicionar o endereço de carregamento base para que em cada um desses endereços de e coloque esse resultado em imagem como sua carregado na memória.

Outras dicas

Passe uma tabela de ponteiros de função relevante como um parâmetro. Como alternativa, você pode ter um código gerado depender de uma área de dados colocada em um local fixo, em relação ao código.

Lembro -me de que, quando estava mexendo com essas coisas, configurei uma página de memória de leitura/gravação/execução, usava o primeiro semestre para o código gerado e o segundo semestre para obter dados. O código, uma vez que o controle, seria assim:

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 assim por diante.

Para um código gerado em larga escala, você pode armazená-lo como DLLs completos e usar os serviços de realocação e fixação de endereço fornecidos pelo sistema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top