C dlsym未定义的符号

时间:2016-03-09 15:59:50

标签: c dll

我尝试使用动态链接,但无法获得一个有效的示例。我的图书馆代码是:

dyn_shl.c:

#include <stdio.h>
#include <dyn_shl.h>
void hello (void)
{
  puts("Hello, Im a loaded shared library");
}

头文件( dyn_shl.h

extern void hello(void);

我用以下代码编译它们:

gcc -fPIC -g -c source/dyn_shl.c -o objects/dyn_shl.o -Iincludes/ -DDEBUG -Wall
gcc -shared -W1,-soname,libhello.so -o objects/libhello.so objects/dyn_shl.o

现在nm -D objects / libhello.so显示:

0000000000201030 B __bss_start
                 w __cxa_finalize
0000000000201030 D _edata
0000000000201040 B _end
0000000000000648 T _fini
                 w __gmon_start__
00000000000005f4 T hello
00000000000004d8 T _init
                 w _Jv_RegisterClasses
                 U puts

我的问候符号为00000000000005f4。

我的主要来源是dyn_ratd.c:

#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>

int main (void)
{
  void* lib;
  void (*print_my)(void);
  char *error;

  lib = dlopen("/root/dev/src/wm_rat/objects/libhello.so",RTLD_NOW);
  if(lib = NULL) {
    return printf("ERROR: Cannot load library");
  }
  print_my = dlsym(lib, "hello");
        if ((error = dlerror()) != NULL)  {
            fputs(error, stderr);
            exit(1);
        }
}

我用

构建它
gcc -rdynamic -o bin/dyn_ratd source/dyn_ratd.c -ldl

当我运行bin / dyn_ratd时,我得到 未定义的符号:hello

我不知道我在哪里错过了这一点。谁知道我错过了什么?

1 个答案:

答案 0 :(得分:4)

这是你的问题:

if(lib = NULL) {

不是 lib与NULL进行比较,而是为其分配 NULL。这就是dlsym调用失败的原因。

将作业更改为比较:

if(lib == NULL) {

如果您使用-Wall编译主要来源,则会警告您这一点。