C - dlsym() 处的错误: ./dynlibrary: undefined symbol: method.



我有一个问题无法解决。查找了到目前为止我找到的所有内容。我的问题是,我在我的程序中创建了一个 dyn 库,想要 dlopen 它并从该库中 dlsym 中获取一个方法。

似乎 dlopen 有效,但 dlsym 返回错误"未定义的符号:方法"

其中"方法"是我传递给dlsym的方法的名称。

以下是我创建库的方式:

execl("/usr/bin/gcc", "gcc", "-fPIC", "-Wall", "-g", "-c", "userinput.c", NULL);

和:

execl("/usr/bin/gcc", "gcc", "-ggdb3", "-shared", 
      "-Wl,-soname,libuserinput.so.1", "-o", "libuserinput.so.1.0",
  "userinput.o", "-lc", NULL);

这应该可以工作,因为运行我的代码后有一个库。

我像这样打开库:

static void *my_load_dyn (const char *lib) {
static void *handle;
handle = dlopen ("./libuserinput.so.1.0", RTLD_NOW | RTLD_DEEPBIND);
if (handle == NULL) {
  printf ("error at dlopen(): %sn", dlerror ());
  exit (EXIT_FAILURE);
}
return handle;
}
/* load func from dyn lib"*/
static void *my_load_func (void *handle, char *func) {
  void *funcptr = dlsym (handle, func);
  if (funcptr == NULL) {
    printf ("error at dlsym(): %sn", dlerror ());
    exit (EXIT_FAILURE);
  }
  return funcptr;
}

并像这样调用这些函数:

void *libhandle;
void (*userMethod) (unsigned char *d);
libhandle = my_load_dyn(LIBUSERINPUT);
userMethod = my_load_func(libhandle, "testMethod");
(*userMethod)(d);

编辑:以下是来自UserInput.c的代码:

#include <stdio.h>
#include <unistd.h>
void testMethod(unsigned char *d)
{
d[0] = 'Z';
}

它是在我的程序中生成的,也在正在运行的程序中编译和链接

我可以看到两个可能的问题

  • 代码中有问题

    您确定在userinput.c中将您的method声明为公共职能吗?

    例如,如果您的方法被声明为 static ,那么它将无法从"外部"访问。还有其他方法可以隐藏函数,以免在库外部看到,但是如果不看到任何代码,就无法判断您是否遇到了这个问题。

  • 您的库编译/链接已损坏

    例如,您似乎正在将头文件(userinput.h)链接到生成的库?

    我建议使用适当的构建系统,直到问题得到解决,并在以后切换到即时编译(例如使用 make