Поместите общий объект в указанный c виртуальный адрес и выполните - PullRequest
0 голосов
/ 20 января 2020

Я хотел бы сделать следующее: у меня есть функция в файле .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?
...