Я хотел бы сделать следующее: у меня есть функция в файле .c
. Я хочу скомпилировать его, затем в моей основной функции я хочу поместить этот объект по определенному виртуальному адресу.
Это моя общая функция в sharedfunction.c
#include <stdio.h>
int dummy;
void sharedfunction(int x){
if(x){
dummy &= x;
}
}
У меня есть скомпилировал его, используя: gcc -c -fPIC sharedfunction.c -o sharedfunction.o
Теперь я хотел бы поместить этот объект по определенному виртуальному адресу в моей основной функции.
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define pagesize 4096UL
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
int main() {
void *p = main;
printf("main:%p\n", p);
int fd;
struct stat sb;
off_t offset, pa_offset;
fd = open("sharedfunction.o", O_RDONLY);
if(fd == -1)
handle_error("open");
if (fstat(fd, &sb) == -1) /* To obtain file size */
handle_error("fstat");
offset = 0;
pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);
/* offset for mmap() must be page aligned */
if (offset >= sb.st_size) {
fprintf(stderr, "offset is past end of file\n");
exit(EXIT_FAILURE);
}
// want to put main + 0x10_000 virtual address
void* func = mmap(
(void*) (p + 0x10000),
pagesize,
PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE,
fd, pa_offset);
if (func == MAP_FAILED)
handle_error("mmap");
// how can I call this?
func(10);
return 0;
}
Я компилирую с: gcc -O0 main.c -o main.o
- Как мне позвонить
func
? - Как я могу очистить память после того, как я закончу с этим
func
?