从前者升级到后者时,我在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/

10-12 23:06