Как правильно назначить указатель, возвращаемый dlsym, в переменную типа указателя функции?

Я пытаюсь использоватьdlopen() а такжеdlsym() в моем коде и скомпилировать его сgcc.

Вот первый файл.

/* main.c */

#include <dlfcn.h>

int main()
{
    void *handle = dlopen("./foo.so", RTLD_NOW);

    if (handle) {
        void (*func)() = dlsym(handle, "func");
        func();
    }

    return 0;
}

Вот второй файл.

/* foo.c */

#include <stdio.h>

void func()
{
    printf("hello, world\n");
}

Вот как я компилирую и запускаю код.

$ gcc -std=c99 -pedantic -Wall -Wextra -shared -fPIC -o foo.so foo.c
$ gcc -std=c99 -pedantic -Wall -Wextra -ldl -o main main.c
main.c: In function ‘main’:
main.c:10:26: warning: ISO C forbids initialization between function pointer and ‘void *’ [-Wpedantic]
         void (*func)() = dlsym(handle, "func");
                          ^
$ ./main
hello, world

Как я могу избавиться от предупреждения?

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

main.c:10:26: warning: ISO C forbids conversion of object pointer to function pointer type [-Wpedantic]
         void (*func)() = (void (*)()) dlsym(handle, "func");
                          ^

Что убедит компилятор в том, что этот код в порядке?

Ответы на вопрос(6)

Ваш ответ на вопрос