gcc链接器解析符号

时间:2017-01-28 20:40:45

标签: gcc ld ldd .so

在将共享库与另一个共享库链接以及将二进制文件与共享库链接时,我一直在努力了解gcc链接器的工作方式以及不同之处。我使用的是Ubuntu 16.04.1 LTS,gcc 5.4.0和ld 2.26.1。

以下是在一些C源文件上执行的两组命令序列。

序列1: -

        @ApiModelProperty(allowableValues="range[-infinity, 50]")
        private MyCustomGenericProp<String> text;

序列2: -

ammal@ubuntu:~/linktest6$ cat a.c 
#include <stdio.h>

int a_func() {
    printf("Running a_func()\n");

    return 0;
}

ammal@ubuntu:~/linktest6$ cat b.c 
#include <stdio.h>

int a_func();

int b_func() {
    printf("Running b_func()\n");
    a_func();

    return 0;
}

ammal@ubuntu:~/linktest6$ cat d.c 
#include <stdio.h>

int b_func();

int d_func() {
    printf("Running d_func()\n");
    b_func();

    return 0;
}

ammal@ubuntu:~/linktest6$ cat myprog.c 
#include <stdio.h>

int d_func();

int main() {
    printf("Running myprog_func()\n");
    d_func();

    return 0;
}

ammal@ubuntu:~/linktest6$ gcc -shared -fPIC -o liba.so a.c 

ammal@ubuntu:~/linktest6$ ldd -r liba.so 
    linux-vdso.so.1 =>  (0x00007ffc6fded000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1898da3000)
    /lib64/ld-linux-x86-64.so.2 (0x0000555e2853c000)

ammal@ubuntu:~/linktest6$ gcc -shared -fPIC -o libb.so b.c 

ammal@ubuntu:~/linktest6$ ldd -r libb.so 
    linux-vdso.so.1 =>  (0x00007ffd82127000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0cc6253000)
    /lib64/ld-linux-x86-64.so.2 (0x00005586e6a36000)
undefined symbol: a_func    (./libb.so)

ammal@ubuntu:~/linktest6$ gcc -shared -fPIC -o libd.so d.c 

ammal@ubuntu:~/linktest6$ ldd -r libd.so 
    linux-vdso.so.1 =>  (0x00007ffc3addb000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f408db59000)
    /lib64/ld-linux-x86-64.so.2 (0x0000558720efc000)
undefined symbol: b_func    (./libd.so)

ammal@ubuntu:~/linktest6$ gcc -fPIC -o myprog myprog.c -L. -ld -lb -la

ammal@ubuntu:~/linktest6$ ldd -r myprog
    linux-vdso.so.1 =>  (0x00007ffe807aa000)
    libd.so => not found
    libb.so => not found
    liba.so => not found
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f344acce000)
    /lib64/ld-linux-x86-64.so.2 (0x0000563a89eb4000)
undefined symbol: d_func    (./myprog)

我的问题是,为什么我能够在第一种情况下成功编译二进制文件而不是第二种情况。

1 个答案:

答案 0 :(得分:0)

在序列2中,libd.so链接到共享对象(即libb.so)。 gcc需要一条路径来解决它。请尝试以下方法。 $ gcc -fPIC -o myprog myprog.c -L。 -ld -lb -la -Wl,-rpath = / home / ammal / linktest6