共享库神秘地没有与应用程序链接

sho*_*app 2 linux g++ shared-libraries dynamic-linking

我有一个共享库(libhoard.so),我试图用简单的测试二进制文件链接.但是,根据我在共享库上编译的机器不会显示在测试二进制文件中.我不确定机器上存在什么差异,这也是我提出这个问题的部分原因. 我很好奇我可以做些什么来解决为什么共享库没有显示在"损坏"的机器上的测试二进制文件?


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

$ g++ -L. -lhoard hoard_test.o 
Run Code Online (Sandbox Code Playgroud)

破机:

$ 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)
Run Code Online (Sandbox Code Playgroud)

工作机器:

$ 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)
Run Code Online (Sandbox Code Playgroud)

这是一些随机版本信息:

破机:

$ 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
Run Code Online (Sandbox Code Playgroud)

工作机器:

$ 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)
Run Code Online (Sandbox Code Playgroud)

Chr*_*ung 7

tl; dr version:添加-Wl,--no-as-needed到链接命令.

经过与OP的一系列实验和对话后,我发现了正在发生的事情.

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

Hoard的工作方式是LD_PRELOAD图书馆.即,您不应该libhoard.so直接使用函数.当然,如果您愿意,可以libhoard直接链接... --as-needed当然,除非使用.

在发现这个之后,解决方案很简单.只需添加-Wl,--no-as-neededgcc链接命令即可.