【问题标题】:error at dlsym(): ./dynlibrary: undefined symbol: methoddlsym() 处的错误:./dynlibrary:未定义符号:方法
【发布时间】:2014-01-08 03:50:12
【问题描述】:

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

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

其中“method”是我传递给 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(): %s\n", 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(): %s\n", 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';
}

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

【问题讨论】:

  • nm -D libuserinput.so.1.0 | grep testMethod,你看到了什么?
  • 什么都没有。是的,我也应该这么说。我在那个 lib 上尝试了 nm 并且函数名不在符号表中 listet 。很抱歉没有提到这一点。现在我的问题是:为什么方法不在那里?
  • 你使用的是哪个gcc版本`这是在哪个系统上?
  • 此处无法重现。显示一个独立的测试用例。
  • 也许我在其余代码中的分叉是错误的。如果我编译/链接我的自我,它似乎可以工作

标签: c gcc dynamic-library dlsym


【解决方案1】:

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

  • 代码有问题

    您确定将您的method 声明为userinput.c 中的public 函数吗?

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

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

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

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

【讨论】:

  • 我想在我的程序中编译/链接。我会在我的问题中发布上面 userinput.c 的代码。是的 userinput.h 不是必需的。我会删除那个
  • 我建议你首先在你的程序之外编译/链接,一旦成功,就在你的程序中进行。如果您在复杂的设置中遇到问题,首先降低复杂性总是一个好主意...
  • 自己编译/链接它可以工作。也许我的分叉不好
猜你喜欢
  • 2016-10-07
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 2012-10-10
  • 2013-10-22
相关资源
最近更新 更多