Copia una funzione in memoria in una posizione diversa ed essere in grado di eseguirla dalla nuova posizione

0

Come sono andato a copiare una funzione in memoria in una posizione diversa ed essere in grado di eseguirla dalla nuova posizione in C ++?

Pensavo che forse memcmp avrebbe funzionato, ma non sono sicuro di come avrei potuto eseguirlo dopo averlo copiato nella nuova posizione.

    
posta Adam Smith 25.10.2016 - 20:39
fonte

1 risposta

5

Non puoi farlo (copiando il codice di qualche funzione) in modo portabile. Il codice macchina di alcune funzioni non può essere spostato senza attenzione, perché in molti insieme di istruzioni il codice dipende dalla sua posizione. Ad esempio, molte istruzioni di CALL o JUMP sono relative al contatore del programma (quindi se le "sposti" salteranno in una posizione errata). I dettagli sono specifici dell'implementazione e variano con il compilatore, il chiamata alle convenzioni , il insieme di istruzioni , ABI , sistema operativo . Ulteriori informazioni su linker , ad es. Linkers & caricatori libro.

I thought maybe memcpy would work

No, generalmente no. (BTW memcmp sta solo confrontando i byte, non "spostandoli" o "copiandoli").

Leggi informazioni su Codice indipendente posizione e Relocation (& spazio di indirizzi virtuali )

Forse dovresti prendere in considerazione la generazione di codice macchina, usando qualche libreria di compilazione JIT come GNU lightning o GNU libjit o asmjit o GCCJIT o LLVM . Sui sistemi POSIX, potresti semplicemente emettere un codice C o C ++ in un file temporaneo, compilarlo (in un oggetto condiviso indipendente dalla posizione) e usare dlopen (3) & dlsym (3) (vedi qui per ulteriori informazioni.

but I'm not sure how I'd go about running it after it copied to the new location

Se la nuova posizione contiene codice macchina eseguibile valido (ma vedi W ^ X ), basta usare un puntatore a funzione (e chiamarlo). Ma attenzione al comportamento non definito .

PS. Dovresti davvero motivare la tua domanda, che sembra un problema XY .

    
risposta data 25.10.2016 - 20:54
fonte

Leggi altre domande sui tag