LINUX.ORG.RU

хмм callback?

при инициализации библиотеки (типа функции init внутри библиотеки, вызываемой "программой") передавать указатель на функцию из "программы", которую должна вызывать библиотека. если много функций - массив указателей.

в чём проблема-то? и каким образом тут замешан компилятор? или я чего-то не понимаю?

zh
()

Легко. Бинарник линковать с ключом '-rdynamic'

t.c:
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main_func(const char *str)
{
    printf("Hello from main: '%s'\n", str);

    return strlen(str);
}

int main()
{
    void *h = dlopen("./p.so", RTLD_NOW);
    int (*plug_func)(const char *);

    if (!h) {
        fprintf(stderr, "%s\n", dlerror());
        exit(1);
    }

    plug_func = dlsym(h, "plug_func");

    printf("Plug_func returns %d\n", (*plug_func)("world"));

    dlclose(h);

    return 0;
}

p.c:
#include <stdio.h>
#include <string.h>

int main_func(const char *);

int plug_func(const char *str)
{
    int ret = strlen(str);

    ret += main_func("Hello");
    printf("Plug: %s\n", str);

    return ret;
}

$ gcc -Wall -rdynamic -ldl -o t t.c
$ gcc -Wall -shared -nostartfiles -fPIC -o p.so p.c
$ ./t
Hello from main: 'Hello'
Plug: world
Plug_func returns 10
$

kemm
()
Ответ на: комментарий от devinull

хмм, ну тогда, видимо, как выше написано =)

я просто по-другому не делал. да и особо не нужно было. был один здоровый проект, требовавший модулей, но писал я его не с нуля (перешёл по наследству на одной из предыдущих мест работы). там работа с модулями была организована именно так, как я описал. честно говоря, не задумывался о чём-то другом =) оно геморрою немного приносило.

zh
()
Ответ на: комментарий от devinull

Только не могу разобраться, как вместо экспортирования всех символов эеспортировать только нужные. Такое возможно?

devinull ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.