首页 文章

C中的动态加载

提问于
浏览
-2

我在一段代码中工作,它从动态库加载一个函数(接收2个char指针和一个int并返回一个int),这给我带来了麻烦 . 我无法访问库代码 . 我的代码看起来像这样:

typedef int (*func_t)(char*, char*, int);
func_t funcptr;
void *lib = dlopen(library.so, RTLD_LAZY);
if(dlerror() != NULL)
    fprintf(stderr, "Error at dlopen");
funcptr = (func_t) dlsym(lib, "function"); 
if(dlerror() != NULL)
    fprintf(stderr, "Error at dlsym");
(*funcptr)(arg1, arg2, arg3);//arguments are correct, no problem there
dlclose(lib);

当我运行它时,它总是抛出错误消息并且函数不执行 . 我几乎尝试了一切 . 有人可以帮忙吗?

编辑:我已经打印了dlerror()返回的字符串:首先它说“没有这样的文件或目录”,然后是“未定义的符号:函数” . 我以为我可能在错误的目录中搜索,所以我使用getcwd检查它,我在正确的目录中搜索 .

1 回答

  • 1

    仔细阅读dlopen(3) ..

    请注意,在给出没有/的文件名时,dlopen有一个奇怪但有记录的行为 . 所以仔细阅读该页面几次!

    library.so 看起来非常可疑....你真的有一个名为 so 的字段的 library 变量吗?也许你想要一个文字字符串 "library.so" . 然后试试

    typedef int (func_sig_t)(char*, char*, int);
    func_sig_t* funcptr;
    void *lib = dlopen("./library.so", RTLD_LAZY);
    if (!lib) 
      { fprintf(stderr, "dlopen failed: %s\n", dlerror()); 
        exit(EXIT_FAILURE); };
    funcptr = (func_sig_t*) dlsym(lib, "function");
    if (!funcptr) 
      { fprintf(stderr, "dlsym failed: %s\n", dlerror());
        exit(EXIT_FAILURE); };
    int res = funcptr(arg1, arg2, arg3);
    dlclose (lib);
    funcptr = NULL;
    

    gcc -Wall -g 编译 . 而且 use the gdb debugger

相关问题