dlopen 中对 __dlopen 的未知引用

Posted

技术标签:

【中文标题】dlopen 中对 __dlopen 的未知引用【英文标题】:Unknown reference to __dlopen in dlopen 【发布时间】:2011-09-23 08:31:23 【问题描述】:

dlopen 位于 libdl.a 但是当我将我的应用程序链接到 libdl.a 时,gcc 链接器会抛出此错误:unknow reference to __dlopen called in dlopen

我应该导入另一个.a吗?

【问题讨论】:

@Guillaume07:您使用的是 Ubuntu 吗?也许尝试安装libc6-dev 对于 ar 档案,顺序也很重要。 @phimuemue:是的,我正在使用 Ubuntu 【参考方案1】:

当我尝试静态编译 dlopen 模型程序时,gcc(Archlinux/gcc 版本 4.6.1 20110819(预发布))告诉我:

$ gcc test.c  -ldl -static  
/tmp/ccsWe4RN.o: In function `main': test.c:(.text+0x13): 
warning: Using 'dlopen' in statically linked applications requires 
at runtime the shared libraries from the glibc version used for linking

确实,当我在 /usr/lib/ 中运行此脚本时

for i in *.a; 
do 
    echo $i; 
    readelf -a $i | grep __dlopen;
done

我看到了:

libc.a
16: 0000000000000080    69 FUNC    GLOBAL DEFAULT    1 __dlopen
000000000000  002300000001 R_X86_64_64       0000000000000000 __dlopen + 0
35: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND __dlopen

所以根据第一行,libc.a 确实定义了您缺少的符号。

在我的系统中,gcc test.c -ldl -static 足以让应用程序运行,但是

gcc <file> -static -ldl -lc

应该解决您系统中的问题。

【讨论】:

【参考方案2】:

你应该可以使用共享库libdl.so

gcc -ldl ...

如果您对使用静态版本没有强烈要求。

【讨论】:

不确定,但链接器似乎找到了dlopen(在libdl.a),但没有找到__dlopen(因此,它似乎在其他地方......)。 在我的系统 (Fedora) 中,dlopen__dlopen 似乎都在 libldl.so 中,但 未定义(但存在)在 libldl.a 中(看起来很奇怪!) 不幸的是我对使用静态版本有很强的要求 为什么有这个要求。这是非常不寻常的。 因为静态二进制文件是可移植的,没有动态链接地狱问题等等。

以上是关于dlopen 中对 __dlopen 的未知引用的主要内容,如果未能解决你的问题,请参考以下文章