+-

我有一个我实现的共享库,并希望.so调用一个在加载库的主程序中实现的函数.
假设我有main.c(可执行文件),其中包含:
void inmain_function(void*);
dlopen("libmy.so");
在my.c(libmy.so的代码)中我想调用inmain_function:
inmain_function(NULL);
无论主程序中是否定义了main_function,共享库如何调用inmain_function.
注意:我想从my.c中调用main.c中的符号而不是反之亦然,这是常见的用法.
最佳答案
您需要在.so中创建一个寄存器函数,以便可执行文件可以为您的.so提供一个函数指针,以供以后使用.
像这样:
void in_main_func () {
// this is the function that need to be called from a .so
}
void (*register_function)(void(*)());
void *handle = dlopen("libmylib.so");
register_function = dlsym(handle, "register_function");
register_function(in_main_func);
register_function需要将函数指针存储在.so中的变量中,其中.so中的其他函数可以找到它.
你的mylib.c需要看起来像这样:
void (*callback)() = NULL;
void register_function( void (*in_main_func)())
{
callback = in_main_func();
}
void function_needing_callback()
{
callback();
}
点击查看更多相关文章
转载注明原文:共享库(.so)如何调用在其加载程序中实现的函数? - 乐贴网