【问题标题】:ldd dependenciesldd 依赖项
【发布时间】:2011-11-23 16:14:04
【问题描述】:

我正在 Linux (Ubuntu 11) 下编译 2 个共享库(“A”、“B”)

库“B”正在使用库“A”中的导出函数(使用 -lA 静态链接)

但是当我在“B”上运行 ldd 时,我只有*

linux-gate.so.1 =>  (0x004c0000) libc.so.6  
/lib/i386-linux-gnu/libc.so.6 (0x00abf000)  
/lib/ld-linux.so.2 (0x00679000)

我看不到我的“A”依赖项!?

奇怪,我(几乎)很确定 ldd 用于显示所有静态依赖项!?

【问题讨论】:

  • 首先,静态链接将代码集成到生成的二进制文件中。其次,允许链接器优化未使用的定义(即,您应该从引用的库中获取至少一个外部对象的地址)
  • 好的,找到了...我在makefile中放错了-lA。对于像 gcc 这样的软件来说,这样的事情真是太棒了!

标签: linux gcc shared-libraries ldd


【解决方案1】:

来自man ldd

ldd - 打印共享库依赖项

静态库没有运行时依赖项,因为它们是静态链接的,

【讨论】:

  • 好的,但是现在如果我在“A”上设置运行时依赖项,我会得到相同的结果。另一方面,如果我将它们与可执行文件(gcc ok.c -I.. -Lrep -lA -lB -ldl -lz)链接起来,ldd 会将所有“A”和“B”作为依赖项!
  • 当您使用-lA 链接可执行文件时,您必须使用libA.so,而不是libA.a。如果您执行后者(就像您显然对 libB.so 所做的那样),ldd executable 也不会显示对 libA.so 的依赖。
【解决方案2】:

您需要将libA.so 动态链接到libB.so,即用类似的东西构建libB.so

 gcc -shared -o libB.so B*.pic.o -lA 

(假设不存在libA.a,只有libA.so

然后你可以使用ldd libB.so 来检查它是否链接libA.so

例如查看大多数 GUI 库,例如 /usr/lib/libQtGui.so.4/usr/lib/libgtk-3.so,例如

% ldd /usr/lib/libgtk-3.so
linux-vdso.so.1 =>  (0x00007fffe4cef000)
libgdk-3.so.0 => /usr/lib/libgdk-3.so.0 (0x00007f5a69c3b000)
libpangocairo-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.0 (0x00007f5a69a00000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f5a696c0000)
libXcomposite.so.1 => /usr/lib/x86_64-linux-gnu/libXcomposite.so.1 (0x00007f5a694be000)
libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f5a692bc000)
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f5a690b5000)
libatk-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libatk-1.0.so.0 (0x00007f5a68e92000)
libcairo-gobject.so.2 => /usr/lib/libcairo-gobject.so.2 (0x00007f5a68c8a000)
libcairo.so.2 => /usr/lib/libcairo.so.2 (0x00007f5a689c9000)
libgdk_pixbuf-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007f5a687aa000)
libgio-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0 (0x00007f5a68465000)
libpangoft2-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0 (0x00007f5a68238000)
libpango-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007f5a67feb000)
libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f5a67d4d000)
libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f5a67b17000)
libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f5a678c6000)
libgmodule-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f5a676c3000)
libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f5a674bd000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f5a672b5000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f5a66fbe000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5a66d3b000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5a66b1f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5a6679b000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f5a66587000)
libXinerama.so.1 => /usr/lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007f5a66385000)
libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007f5a66176000)
libXrandr.so.2 => /usr/lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007f5a65f6d000)
libXcursor.so.1 => /usr/lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007f5a65d63000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f5a65b46000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5a65942000)
libpixman-1.so.0 => /usr/lib/x86_64-linux-gnu/libpixman-1.so.0 (0x00007f5a656ba000)
libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f5a65494000)
libxcb-shm.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f5a65291000)
libxcb-render.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007f5a65087000)
libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f5a64e7d000)
libz.so.1 => /usr/lib/libz.so.1 (0x00007f5a64c65000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f5a64a44000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f5a6482e000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f5a64604000)
libffi.so.5 => /usr/lib/x86_64-linux-gnu/libffi.so.5 (0x00007f5a643f7000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5a6a50e000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f5a641ba000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f5a63fb7000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f5a63db1000)

【讨论】:

  • 是的,这就是重点。我之前的消息不准确,我同意。 “静态”不是正确的术语(我是 Windows 用户,我说的是 .lib)
  • 如果我在旧的 Ubuntu 下运行相同的 makefile(Linux 2.6.24-28-generic 我没有问题)! ldd 有效!?
猜你喜欢
  • 2013-02-10
  • 2023-03-11
  • 1970-01-01
  • 2021-08-08
  • 2018-11-02
  • 2018-04-29
  • 2020-05-07
  • 1970-01-01
  • 2014-03-18
相关资源
最近更新 更多