Como atribuir corretamente um ponteiro retornado pelo dlsym em uma variável do tipo de ponteiro de função?

Estou tentando usardlopen() edlsym() no meu código e compilá-lo comgcc.

Aqui está o primeiro arquivo.

/* main.c */

#include <dlfcn.h>

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

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

    return 0;
}

Aqui está o segundo arquivo.

/* foo.c */

#include <stdio.h>

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

Aqui está como eu compilar e executar o código.

$ 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

Como posso me livrar do aviso?

A conversão de tipo não ajuda. Se eu tentar digitar cast, o valor de retorno dedlsym() em um ponteiro de função, recebo esse aviso.

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

O que convenceria o compilador de que esse código está correto?

questionAnswers(6)

yourAnswerToTheQuestion