我有一个共享库 (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)
最佳答案
tl;dr 版本:将 -Wl,--no-as-needed
添加到链接命令。
在与 OP 进行了一系列实验和对话之后,我弄清楚了发生了什么。
在最新版本的 Ubuntu 中,ld
默认使用 --as-needed
。这样做的目的是删除对未明确要求的库的引用。
Hoard 的工作方式是作为一个LD_PRELOAD
库。也就是说,您不需要直接使用 libhoard.so
中的函数。当然,如果您愿意,您可以直接链接到 libhoard
中……当然,除非使用 --as-needed
。
发现这一点之后,解决办法就简单了。只需将 -Wl,--no-as-needed
添加到 gcc
链接命令即可。
关于linux - 共享库神秘地没有链接到应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8814707/