动态链接尝试所有产生静态链接的二进制文件?为什么?

时间:2018-04-13 03:37:12

标签: linux gcc shared-libraries

我正在关注本教程中的“T”here关于在Linux中创建动态链接的共享库,当我按照说明操作时,gcc似乎静态地链接了库。

本教程提出3个文件:foo.cfoo.hmain.c。主要包括foo.hfoo()中定义的foo.c。{/ 1}

我在调试教程中做了一点改动......我的foo看起来像这样:

void foo(void) {
    int i = 54321;
    printf( "Shared lib: %d\n", i );
}

它告诉我使用以下3个步骤进行编译:

gcc -c -Wall -Werror -fpic foo.c
gcc -shared -o libfoo.so foo.o
gcc -L/home/username/foo -Wall -o test main.c -lfoo

当我运行./test时,它可以工作,我可以从foo()看到“hello 54321”。事实上,它运作良好,如果我删除libfoo.so,它就有效。看似可疑,所以我做objdump -S test并在对象文件中找到了这个小家伙:

000000000000068a <foo>:
 68a: 55                    push   %rbp
 68b: 48 89 e5              mov    %rsp,%rbp
 68e: 48 83 ec 10           sub    $0x10,%rsp
 692: c7 45 fc 31 d4 00 00  movl   $0xd431,-0x4(%rbp)
                                   ^^^  there's my constant, 54321, in hex.
                      should be in the "dynamic" object, not here, right?

 699: 8b 45 fc              mov    -0x4(%rbp),%eax
 69c: 89 c6                 mov    %eax,%esi
 69e: 48 8d 3d af 00 00 00  lea    0xaf(%rip),%rdi        # 754 <_IO_stdin_used+0x4>
 6a5: b8 00 00 00 00        mov    $0x0,%eax
 6aa: e8 b1 fe ff ff        callq  560 <printf@plt>
 6af: 90                    nop
 6b0: c9                    leaveq
 6b1: c3                    retq

我做错了什么? 提前谢谢你......

P.S。使用version gcc (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0

在x86_64 Debian Stretch上进行编译

1 个答案:

答案 0 :(得分:1)

  

我做错了什么?

您很可能在libfoo.a目录中有/home/username/foo

或者您在意图#include "foo.c"时意外使用了#include "foo.h"

您可以尝试使用以下内容确定foo()的定义test的位置:

gcc -L/home/username/foo -Wall -o test main.c -lfoo -Wl,-y,foo

应该显示来自某些foo引用/tmp/xyz.o以及来自<somewhere>定义