This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
how to build executable instructions blocks dynamically ?
- From: "Gorgonite" <gorgonite at freesurf dot fr>
- To: <gcc-help at gcc dot gnu dot org>
- Date: Wed, 6 Jun 2007 22:08:09 +0200 (CEST)
- Subject: how to build executable instructions blocks dynamically ?
- Reply-to: gorgonite at freesurf dot fr
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.