Unknown reference to __dlopen in dlopen

后端 未结 2 1143
庸人自扰
庸人自扰 2021-02-08 18:46

dlopen is located in libdl.a but when I link my application against libdl.a , gcc linker throw this error : unknow reference to __dl

2条回答
  •  别那么骄傲
    2021-02-08 19:48

    When I try to compile statically a dlopen mockup program, gcc (Archlinux/gcc version 4.6.1 20110819 (prerelease)) tells me:

    $ 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
    

    and indeed, when I ran this script in /usr/lib/

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

    I saw:

    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
    

    so as per the first line, libc.a does define your missing symbole.

    In my system, gcc test.c -ldl -static is enough to make the application run, but

    gcc  -static -ldl -lc
    

    should fix the problem in your system.

提交回复
热议问题