正确使用libdl和动态链接库

时间:2011-12-03 20:17:14

标签: c dll shared-libraries

我需要动态链接我创建的库。我不确定问题是什么。这一切都正确编译,但我总是将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。

4 个答案:

答案 0 :(得分:17)

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

使用-c生成目标文件(不是共享对象)并将其调用michaelSchilling.so。链接器甚至不会被调用。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

hw11-lib-michaelSchilling.so是否在文件系统的绝对根目录中?你声称它是通过对它进行削减...但我怀疑它不是。

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

答案 3 :(得分:0)

gcc -fPIC -shared -rdynamic  library.c -o library.o
编译库时,

在Linux上适用于我 对于打开它的代码,您需要-ldl