【问题标题】:Dynamic loading in CC中的动态加载
【发布时间】:2014-06-11 11:42:57
【问题描述】:

我正在编写一段代码,该代码从动态库加载一个函数(接收 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 检查了它,并在正确的目录中搜索。

【问题讨论】:

  • library.so 的值是多少?并且你假设输出dlerror()返回的字符串,而不只是检查它是否是NULL
  • 打印 dlerror() 返回的字符串。它会告诉你出了什么问题。
  • 另外,请仔细阅读 dlopen(3).. 你的代码可以编译吗? library.so 看起来很奇怪(也许你的意思是 "./library.so" ....)。使用gcc -Wall -g 编译,然后使用调试器 (gdb)
  • 事实上,这只是我为完成大学工作而必须完成的更大计划的一部分。 library.so 是我的老师写的,他们给了我一个 Makefile 来编译。无论如何,我会尝试使用 ./library.so
  • 它可能应该是一个文字字符串,其中包含一些共享 ELF 可执行文件的文件路径。所以引号" 是绝对必要的!目前尚不清楚您的代码是否正在编译!

标签: c linux unix dynamic


【解决方案1】:

仔细阅读dlopen(3)..

请注意,dlopen 在给出不带/ 的文件名时有一个奇怪但记录在案的行为;所以请仔细阅读该手册页!

library.so 看起来很可疑.... 你真的有一个 library 变量和一个名为 so 的字段吗?也许你想要一个文字字符串"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 调试器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-31
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多