gpt4 book ai didi

c - 如何将 dlsym 返回的指针正确赋值给函数指针类型的变量?

转载 作者:太空狗 更新时间:2023-10-29 16:28:38 25 4
gpt4 key购买 nike

我正在尝试在我的代码中使用 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");
^

什么能让编译器相信这段代码是好的?

最佳答案

如果您想迂腐地正确,请不要尝试解析函数的地址。相反,从动态库中导出某种结构:

在图书馆

struct export_vtable {
void (*helloworld)(void);
};
struct export_vtable exports = { func };

在调用者中

struct export_vtable {
void (*helloworld)(void);
};

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

if (handle) {
imports = dlsym(handle, "exports");
if (imports) imports->helloworld();
}

return 0;
}

这种技术实际上很常见,不是为了可移植性——POSIX 保证函数指针可以与 void* 相互转换——而是因为它允许更大的灵 active 。

关于c - 如何将 dlsym 返回的指针正确赋值给函数指针类型的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36384195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com