【问题标题】:Shared library mysteriously doesn't get linked to application共享库神秘地没有链接到应用程序
【发布时间】:2012-02-07 12:56:54
【问题描述】:

我有一个共享库 (libhoard.so),我正在尝试将它与一个简单的测试二进制文件链接。但是,取决于我在共享库上编译的机器,它不会出现在测试二进制文件中。我不确定机器上存在哪些差异,这也是我问这个问题的部分原因。 我很好奇我可以做些什么来解决为什么共享库没有出现在“损坏”机器上的测试二进制文件中?


我使用这个命令编译了两个二进制文件(libhoard.so 在同一个目录中):

$ g++ -L. -lhoard hoard_test.o 

破机:

$ ldd a.out 
  linux-gate.so.1 =>  (0x00858000)
  libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x004dc000)
  libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00aaf000)
  libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x00675000)
  /lib/ld-linux.so.2 (0x00d18000)
  libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x0040d000)

工作机器:

$ ldd a.out 
  linux-gate.so.1 =>  (0x00110000)
  libhoard.so (0x00111000) <----------------- THERE IT IS!
  libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x03ba8000)
  libm.so.6 => /lib/libm.so.6 (0x007a9000)
  libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00bf7000)
  libc.so.6 => /lib/libc.so.6 (0x0063e000)
  libdl.so.2 => /lib/libdl.so.2 (0x007d4000)
  libpthread.so.0 => /lib/libpthread.so.0 (0x007db000)
  /lib/ld-linux.so.2 (0x0061e000)

这是一些随机的版本信息:

破机:

$ uname -srv
Linux 2.6.38-11-generic #50-Ubuntu SMP Mon Sep 12 21:18:14 UTC 2011
$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1

工作机器:

$ uname -srv
Linux 2.6.25.3-18.fc9.i686 #1 SMP Tue May 13 05:38:53 EDT 2008
$ g++ --version
g++ (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8)

【问题讨论】:

  • 工作机器是 64 位安装,而损坏的是 32 位安装?
  • 两者都是 32 位的(uname -m 的输出是 i686)
  • 是否有与测试和生产相关的#def。链接器不会包含未使用的库的链接。
  • 如果在“损坏”的机器上链接没有错误,您在尝试在其上运行程序时是否遇到任何错误?
  • 它是否链接了“损坏”机器上的静态版本?你有任何未解决的符号链接错误吗?大概不会。程序运行时会发生什么?

标签: linux g++ shared-libraries dynamic-linking


【解决方案1】:

tl;dr 版本:将-Wl,--no-as-needed 添加到链接命令中。

在与 OP 进行了一系列实验和对话后,我弄清楚了发生了什么。

在最新版本的 Ubuntu 中,ld 默认使用 --as-needed。这样做是为了删除对未明确要求的库的引用。

Hoard 的工作方式是作为LD_PRELOAD 库。即,您不需要直接使用 libhoard.so 中的函数。当然,如果你想可以直接链接到libhoard...当然,除非使用--as-needed

发现这一点后,解决方法很简单。只需将-Wl,--no-as-needed 添加到gcc 链接命令即可。

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    相关资源
    最近更新 更多