【问题标题】:Proper use libdl and dynamically linked libraries正确使用 libdl 和动态链接库
【发布时间】:2012-01-12 07:53:45
【问题描述】:

我需要动态链接我创建的库。我不确定问题是什么。这一切都正确编译,但我总是将handle 捕获为NULL 指针:

void *handle;
char *error;
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY);
//same error comes up with full path as well as './hw11...'
if(!handle){
    error = dlerror();
    printf("%s\n", error);
    printf("Error loading library.\n");
    exit(1);
}

我无法通过这个错误,我不确定可能出了什么问题。我很确定我已经正确编译了所有内容。以下是我使用的编译步骤:

gcc -rdynamic -c hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so
gcc hw11-michaelSchilling-4.c -ldl -o hw11-michaelSchilling-4

我收到一条错误消息

只能加载 ET_DYN 和 ET_EXEC。

【问题讨论】:

    标签: c dll shared-libraries


    【解决方案1】:

    在构建hw11-lib-michaelSchilling.so 时,您似乎没有告诉gcc 您想要一个共享对象(名称中的.so 是不够的)。

    使用-c,它会生成一个对象文件(不是共享 对象)并将其称为michaelSchilling.so。链接器甚至没有被调用。

    gcc 命令行中删除-c 并添加-shared

    gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so
    

    【讨论】:

    • 连同-rdynamic?刚刚尝试了两者和-shared,但我得到了同样的错误。
    • @MichaelSchilling:我认为-rdynamic 与该问题无关,因此您最好保留它以防您的代码需要它。
    • @MichaelSchilling:你删除了-c吗?
    【解决方案2】:

    斜杠 (/) 作为路径名的第一个字符表示路径名是绝对的(相对于根目录),与当前工作目录无关,当然也与二进制文件的位置无关。您需要通过确定二进制文件的位置来指定完整路径(这本身并不是一个简单的问题),或者您可以将$ORIGINdlopen 一起使用(它适用于rpath,但我不确定它是否适用于dlopen)。

    【讨论】:

    • 路径前的句号呢? (./)
    • 这使得它相对于当前工作目录,而不是你的程序二进制文件的位置。
    【解决方案3】:
    gcc -fPIC -shared -rdynamic  library.c -o library.o
    

    编译库时在 Linux 上为我工作 对于打开它的代码,你需要-ldl

    【讨论】:

      【解决方案4】:

      hw11-lib-michaelSchilling.so 是否在文件系统的绝对根目录中?你声称它是通过在它上面加上一个斜线......但我怀疑它不是。

      在您的错误处理中,将dlerror() 的输出包含在您的打印内容中,以查找失败的原因。

      【讨论】:

      • hw11-lib-michaelSchilling.so:无法打开共享对象文件:没有这样的文件或目录这是我得到的错误,但它与我试图运行的程序的目录相同。我还删除了斜线。
      • 尝试提供共享对象的完整绝对路径,看看是否有帮助。
      • 我做到了,我得到了only ET_DYN and ET_EXEC can be loaded.
      猜你喜欢
      • 1970-01-01
      • 2013-08-04
      • 2017-12-12
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      相关资源
      最近更新 更多