当前位置:  开发笔记 > 开发工具 > 正文

加载的库函数如何在主应用程序中调用符号?

如何解决《加载的库函数如何在主应用程序中调用符号?》经验,为你挑选了1个好方法。

加载共享库时,通过该函数打开dlopen(),有没有办法在主程序中调用函数?



1> Johannes Sch..:

dlo.c代码(lib):

#include 

// function is defined in main program
void callb(void);

void test(void) {
    printf("here, in lib\n");
    callb();
}

编译

gcc -shared -olibdlo.so dlo.c

这里是主程序的代码(从dlopen手册页复制并调整):

#include 
#include 
#include 

void callb(void) {
    printf("here, i'm back\n");
}

int
main(int argc, char **argv)
{
    void *handle;
    void (*test)(void);
    char *error;

    handle = dlopen("libdlo.so", RTLD_LAZY);
    if (!handle) {
        fprintf(stderr, "%s\n", dlerror());
        exit(EXIT_FAILURE);
    }

    dlerror();    /* Clear any existing error */

    *(void **) (&test) = dlsym(handle, "test");

    if ((error = dlerror()) != NULL)  {
        fprintf(stderr, "%s\n", error);
        exit(EXIT_FAILURE);
    }

    (*test)();
    dlclose(handle);
    exit(EXIT_SUCCESS);
}

用.构建

gcc -ldl -rdynamic main.c

输出:

[js@HOST2 dlopen]$ LD_LIBRARY_PATH=. ./a.out
here, in lib
here, i'm back
[js@HOST2 dlopen]$

-rdynamic选项将所有符号放在动态符号表中(映射到内存中),而不仅仅是所用符号的名称.在这里进一步了解它.当然,您还可以提供定义库与主程序之间接口的函数指针(或函数指针结构).这实际上是我可能选择的方法.我从其他人那里听说,-rdynamic在Windows中做起来并不容易,而且它还可以使库和主程序之间的通信更加清晰(你可以对可以调用的内容进行精确控制而不是),但它还需要更多家政.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有