+-
共享库(.so)如何调用在其加载程序中实现的函数?
我有一个我实现的共享库,并希望.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)如何调用在其加载程序中实现的函数? - 乐贴网