c - C 中的动态加载

标签 c linux unix dynamic

我正在编写一段从动态库加载函数(接收 2 个字符指针和一个 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() 返回的字符串:首先它说“没有这样的文件或目录”,然后是“ undefined symbol :函数”。我以为我可能在错误的目录中搜索,所以我使用 getcwd 检查了它,并且我正在正确的目录中搜索。

最佳答案

仔细阅读 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编译。并且使用gdb调试器!

关于c - C 中的动态加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23298543/

相关文章:

c++ - 构建 C/C++ 代码时的 Gradle 编译器输出

c++ - 在 Windows 上使用 openssl 库生成随 secret 钥/数据

php - 无法安装旧版本的php

java - 可以让 JNI 支持类路径中的通配符扩展吗?

cvFindContours 没有产生我期望的输出

c - fork()ing - 空闲的 child

linux - Less 从 stderr 获取键盘输入?

C++同时控制另一个程序的I/O

c - 如何循环通过标准输入和管道输出到 C 中的子 execl 命令?

java - unix date 命令和 java simpledateformat 的差异