在dlopen中出现未知的__dlopen引用

13

dlopen 函数位于 libdl.a 中,但是当我将我的应用程序与 libdl.a 进行链接时,gcc 链接器会抛出此错误:在 dlopen 中调用了未知引用 __dlopen

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


@Guillaume07:你在使用Ubuntu吗?也许尝试安装'libc6-dev'。 - phimuemue
1
对于AR归档文件,顺序也很重要。 - PlasmaHH
@phimuemue:是的,我正在使用Ubuntu。 - Guillaume Paris
2个回答

13

当我尝试静态编译一个 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

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


3

您应该能够使用共享库libdl.so

,与此同时:

gcc -ldl ...

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

不确定,但链接器似乎可以找到dlopen(在libdl.a中),但找不到__dlopen(因此,似乎在其他地方...)。 - phimuemue
在我的系统(Fedora)中,dlopen__dlopen 似乎都在 libldl.so 中,但在 libldl.a 中没有被 定义(但是存在)(看起来很奇怪!) - Kevin
不幸的是,我对使用静态版本有强烈的要求。 - Guillaume Paris
为什么有这个要求?这非常不寻常。 - Basile Starynkevitch
2
由于静态二进制文件具有可移植性,不会出现动态链接问题等等。 - Scott Franco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接