【问题标题】:ldd on the binary not showing my shared library二进制文件上的 ldd 未显示我的共享库
【发布时间】:2019-06-03 23:21:20
【问题描述】:

我在构建可执行文件时在命令行上链接了一个共享库。在该可执行文件上运行 ldd 不会显示链接的共享库。

查看链接器的一些输出后,我什至尝试添加-Wl,--no-as-needed 选项,但这也无济于事。

foo.c:

#include <stdio.h>
void foo () {
    printf ("Hello world\n");
}

main.c:

#include <stdio.h>

int main () {
    printf ("In main \n");
    foo ();
}

这是我用来编译和链接的命令:

$ gcc -Wl,--no-as-needed main.c -o main -L./ -lfoo
/bin/ld: cannot find -lfoo
collect2: error: ld returned 1 exit status

$ gcc -c foo.c -shared -Wl,-soname,libfoo.so -o libfoo.so

$ ls -l libfoo.so
-rw-r--r-- 1 apple eng 1488 Jun  4 04:44 libfoo.so

$ gcc -Wl,--no-as-needed main.c -o main -L./ -lfoo

$ ldd main
    linux-vdso.so.1 =>  (0x00007fffbdd6c000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f6367e23000)
    /lib64/ld-linux-x86-64.so.2 (0x00005556e268a000)

libfoo.so 没有出现在上面。

$ objdump -x main | grep NEEDED
  NEEDED               libc.so.6

为什么libfoo.so 不显示为NEEDED

【问题讨论】:

  • 你在什么平台上?
  • gcc 的版本? ldd main的退出代码? (运行ldd main; echo $?
  • uname -a Linux myhost-165 3.10.0-693.11.6.el7.x86_64 #1 SMP Thu Dec 28 14:23:39 EST 2017 x86_64 x86_64 x86_64 GNU/Linux
  • ldd main;echo $? linux-vdso.so.1 => (0x00007ffc17f98000) libc.so.6 => /lib64/libc.so.6 (0x00007f00ed6f2000) /lib64/ld-linux-x86-64.so.2 (0x0000560462687000) 0跨度>
  • @Apad 请将这些详细信息添加到您的问题中。这个输出在 cmets 中的格式很糟糕。

标签: shared-libraries ldd


【解决方案1】:

通过使用 gcc 选项 -c,您告诉它仅从 foo.c 创建对象,因此您从此 gcc 命令获得的唯一产品是 对象文件。它的后缀是.so 只是因为您使用-o 选项强制它。如果您在没有-o 的情况下运行此命令,您会看到输出只是foo.o - 一个目标文件。

如果你在 gcc 命令中省略 -c,你会得到你想要的共享对象。

在输出文件上运行 file 会显示差异(请注意,我没有使用 -o 设置输出名称并让 gcc 使用其默认名称):

-c:

> gcc -c foo.c -shared
> file foo.o
foo.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

没有-c

> gcc foo.c -shared
> file a.out
a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=a63581bfc45f845c501ffb6635, not stripped
                                                                  ^^^
                                                                  |||

【讨论】:

  • 太棒了!谢谢。这有帮助。
  • @Apad 如果此答案对您有所帮助,请单击投票数下方的复选标记将其标记为已接受。
【解决方案2】:

此命令不会生成共享库:

gcc -c foo.c -shared -Wl,-soname,libfoo.so -o libfoo.so

它会生成一个目标文件libfoo.so,稍后静态与您的代码链接。证明:删除lib文件,程序仍然可以运行。

解决方案:

单独编译目标文件,然后将其转换为共享库。您必须通过设置LD_LIBRARY_PATH 告诉加载程序在哪里搜索共享库:

gcc -c foo.c 
gcc foo.o -shared -o libfoo.so
gcc main.c -o main -L./ -lfoo
export LD_LIBRARY_PATH=`pwd`
ldd ./main 
#   linux-vdso.so.1 (0x00007ffe0f7cb000)
#   libfoo.so => /home/---/tmp/libfoo.so (0x00007f9bab6ec000)
#   libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9bab2fb000)
#   /lib64/ld-linux-x86-64.so.2 (0x00007f9babaf0000)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多