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 的未知引用的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 错误 - 返回 process.dlopen(module, path._makeLong(filename));

pjsip android:dlopen 失败:找不到符号“__aeabi_memclr8

LoadError:dlopen(digest/sha1.bundle):找不到符号:_rb_Digest_SHA1_Finish

包含 Boost C++ 标头会导致 dlopen() 返回错误:_ZTVN10__cxxabiv117__class_type_infoE

NDK编译库执行时报dlopen failed: cannot locate symbol &quot;__exidx_end&quot; 解决的方法

试图在 C++ 中嵌入 Lua,“未定义对 'dlopen' 的引用”