Доступ указатель из общей библиотеки в C - PullRequest
3 голосов
/ 08 марта 2012

Я создал общую библиотеку, которая предоставляет массив указателей на функции. Определения функций также есть в этой библиотеке, но они не экспортируются.

Возможно ли из другой программы загрузить эту библиотеку и вызвать эти функции напрямую, используя экспортированные указатели?

Это то, что я пытаюсь сделать.

Моя библиотека:

#include <stdio.h>
void myfun(){
    printf("myfun\n");
}
extern void (*myptr)() = myfun;

Я пытаюсь использовать это так:

#include <dlfcn.h>
int main(){
    void * lib = dlopen("libt1.so", RTLD_NOW);
    if(!lib) { printf("%s\n", dlerror()); return 0; }
    void (*myptr)() = (void (*)()) dlsym(lib, "myptr");
    if(!myptr){ printf("%s\n", dlerror()); return 0; }
    printf("%p\n", myptr);
    myptr();
}

Это дает ошибку segm.

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Кажется, это была глупая ошибка.

void (*myptr)() = (void (*)()) dlsym(lib, "myptr");

Должно быть что-то вроде этого:

void ** myptr = (void**)dlsym(lib, "myptr");
void (*fcn)() = (void (*)()) (*myptr);

Теперь он работает как положено.

0 голосов
/ 08 марта 2012

Да, конечно. dlsym ищет имя функции в таблице символов, чтобы преобразовать его в адрес (указатель на функцию), поэтому, создав собственную таблицу указателей на функции, вы в значительной степени просто делаете это вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...