¿Cómo asignar correctamente un puntero devuelto por dlsym a una variable de tipo de puntero de función?

Estoy tratando de usardlopen() ydlsym() en mi código y compilarlo congcc.

Aquí está el primer archivo.

/* main.c */

#include <dlfcn.h>

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

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

    return 0;
}

Aquí está el segundo archivo.

/* foo.c */

#include <stdio.h>

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

Así es como compilo y ejecuto el 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

¿Cómo puedo deshacerme de la advertencia?

La conversión de tipos no ayuda. Si trato de escribir cast el valor de retorno dedlsym() en un puntero de función, obtengo esta advertencia en su lugar.

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

¿Qué convencería al compilador de que este código está bien?

Respuestas a la pregunta(6)

Su respuesta a la pregunta