C dlsym undefined symbol

标签 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

我的 hello 符号位于 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 时,我得到 undefined symbol :你好

我不明白我错在哪里。有人知道我缺少什么吗?

最佳答案

这是你的问题:

if(lib = NULL) {

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

将分配更改为比较:

if(lib == NULL) {

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

关于C dlsym undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35896521/

相关文章:

c - 我在C编程中遇到错误。 ([Error]预期标识符或 '(' token 之前的 '{')。有人可以帮帮我,让我知道为什么吗?

c - 没有编译错误,但给定输入时崩溃

用C计算文本文件中完整基因的数量

c++ - Visual Studio Force 库导入 C++

c++ - Windows 中使用 Visual Studio 的链接器错误 (LNK2005)

c - pthread_self() 没有返回有意义的线程 ID?

C 中的 CRC 计算

.net - 当非托管依赖项发生冲突时如何使用 2 个第三方 .net 库?

.net - 无法将字符串从 dll(用 C 编写)返回到主程序(使用 .NET)

c# - 如何从 C# 作为 MT4 dll 连接到 Mysql?