Как правильно назначить указатель, возвращаемый 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");
^
Что убедит компилятор в том, что этот код в порядке?