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?