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 "__exidx_end" 解决的方法