从前者升级到后者时,我在Linux上由4.9.2 G++和8.2.0 G++生成的二进制文件之间遇到了一个奇怪的区别。我能够将其缩小到以下最小化的代码段
//main.cpp
int main(){}
//emptylib.cpp
#!/bin/sh
#to build and verify output
rm -rf bin lib *.o
gcc_bin=/path/to/gcc_4.9.2/bin
#gcc_bin=/path/to/gcc_8.2.0/bin
${gcc_bin}/g++ -B${gcc_bin} -c main.cpp
${gcc_bin}/g++ -B${gcc_bin} -c emptylib.cpp
${gcc_bin}/g++ -B${gcc_bin} -shared emptylib.o -o libemptylib.so
${gcc_bin}/g++ -B${gcc_bin} main.o -o main -L. -lemptylib
mkdir bin
mkdir lib
mv libemptylib.so lib/
mv main bin/
ldd bin/main
结果有点奇怪,因为我没有提供
-rpath=../lib
,但最终还是以4.9.2编译器驱动程序提供了(在ldd的输出中):libemptylib.so => /path/to/bin/../lib/libemptylib.so
和8.2.0
libemptylib.so => not found
lib无法解决,正如我期望的那样。我还看不到任何提示搜索任何版本
../lib
的文档,但是我不希望这是任何版本的行为。这是4.9.2或更早版本中的错误,还是最初不应该发生的事情?附带说明一下,8.2.0和4.9.2的bin目录中没有
ld
(尽管我将-B
放在代码段中),所以两个编译器驱动程序都使用/ usr / bin / ld (我已经验证了很多)并仅基于编译器驱动程序产生了不同的结果。更新:
根据要求,我在两个二进制文件上都运行了
readelf -d bin/main
,并且确实收到了rpath的不同输出。 GCC 4.9.2给了我:0x000000000000000f (RPATH) Library rpath: [$ORIGIN:$ORIGIN/../lib64:$ORIGIN/../lib:/path/to/gcc_libs/lib64:/path/to/gcc_libs/lib:/path/to/gcc_4.9.2/lib64:/path/to/gcc_4.9.2/lib]
8.2.0没有那个
0x0000000000000001 (NEEDED) Shared Library: [libemptylib.so]
所以我想我对发生的事情有一个答案。那么,这是如何在4.9.2的二进制文件中结束的呢?为什么在两个版本之间进行了更改,而现在在8.2.0中却没有?
最佳答案
因此,区别在于如何配置GCC 4.9.2与8.2.0。
我猜想8.2来自您的发行版(或至少使用默认安装路径配置),而4.9被配置为安装到/path/to/gcc_4.9.2
中。
这就解释了为什么4.9将-rpath
和/path/to/gcc_4.9.2/lib64
添加到64位版本中。但是,它没有解释$ORIGIN
的/path/to/gcc_4.9.2/lib
(后者不应成为64位版本的一部分)的来源。
配置GCC,使其准确地放置必要的内容,一点也不少,这有点令人不快。如果4.9在该区域有一些错误,我不会感到惊讶。
关于c++ - G++ 4.9.2和8.2.0-具有默认lib路径搜索./../lib目录的最终二进制文件的依赖性(隐式RPATH问题),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60744006/