how to build executable instructions blocks dynamically ?
Gorgonite
gorgonite@freesurf.fr
Wed Jun 6 20:08:00 GMT 2007
Hello,
I'm sorry if the answer has already been given, but I have found an answer
written in 2002 for PowerPC ; and it doesn't work on my laptop :'(
I want to build executable instructions blocks dynamically, in order to use
the "preparations sequences" in a virtual machine.
I want to create a buffer and to put some code into it.
Until now, I've thought (with some help) about doing this :
---------------------------
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/mman.h>
#include <fcntl.h>
typedef void (*FUNCTYPE)(void);
void testBuildFunc() {
size_t size = &&block_end - &&block_begin;
#ifndef NOT_MMAP
unsigned char* buf = mmap(NULL, size, PROT_EXEC|PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANON, -1, 0);
if (buf == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
#else
unsigned char* buf = malloc(size);
if (buf == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
if (mprotect(buf,size,PROT_EXEC|PROT_READ|PROT_WRITE) != 0) {
perror("mprotect");
exit(EXIT_FAILURE);
}
#endif
if (buf == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
unsigned char* beginBuf = buf;
unsigned char* done = &&block_end;
memcpy(buf,&&block_begin,size);
if (msync(block,size,MS_INVALIDATE) != 0) {
perror("msync");
exit(EXIT_FAILURE);
}
int i=1;
FUNCTYPE fn = (FUNCTYPE) beginBuf;
fn();
printf("%d\n",i);
goto *done;
block_begin: {
int j = 0;
}
block_end:
return;
}
------------------------
I have found an answer using cacheflush... but I haven't managed to install
it on my laptop. (centrino cpu with GNU/Linux os)
If someone could help me, it will help me :-)
Thanks
Regards.
More information about the Gcc-help
mailing list