使用 patchelf 和备用 glibc 版本时找不到 libstdc++.so

libstdc++.so not found when using patchelf and alternate glibc version

我正在使用系统范围的 glibc 2.27 的系统上工作,我正在使用 pathelf 将一些可执行文件修补到自定义版本的 glibc 2.23。可执行文件是使用自定义版本的 LLVM 编译的。这在 C 程序上运行良好,但在 C++ 程序上不起作用。

# cp Xalan_base.cc-v2 Xalan_base.cc-v2_patched
# /usr/bin/patchelf --set-interpreter /path_to/glibc-2.23_install/lib/ld-2.23.so --set-rpath /path_to/glibc-2.23_install/lib Xalan_base.cc-v2_patched
# ./Xalan_base.cc-v2_patched -v t5.xml xalanc.xsl
/path_to/Xalan_base.cc-v2_patched: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
# ldd Xalan_base.cc-v2
        linux-vdso.so.1 (0x00007ffe9efb8000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f8db1524000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8db1186000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8db0f6e000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8db0b7d000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f8db18ad000)
# ldd Xalan_base.cc-v2_patched
        linux-vdso.so.1 (0x00007ffe08b7c000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f43a5af0000)
        libm.so.6 => /path_to/glibc-2.23_install/lib/libm.so.6 (0x00007f43a57eb000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f43a55d3000)
        libc.so.6 => /path_to/glibc-2.23_install/lib/libc.so.6 (0x00007f43a5233000)
        /path_to/glibc-2.23_install/lib/ld-2.23.so => /lib64/ld-linux-x86-64.so.2 (0x00007f43a5e79000)
# ls -lah /usr/lib/x86_64-linux-gnu/libstdc++.so.6
lrwxrwxrwx 1 root root 19 May  8 08:51 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 -> libstdc++.so.6.0.25

据我了解,libstdc++ 是一个编译器库。我在这里没有看到我的 LLVM 安装的任何路径,而我看到的那些路径似乎都是有效的。

你能解释一下为什么会这样吗?我需要做什么?

Can you explain why this is happening?

您的 /path_to/glibc-2.23_install/lib/ld-2.23.so 没有 /usr/lib/x86_64-linux-gnu 中查找,因此没有找到 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.

你应该学会永远不要在你的补丁二进制文件上使用ldd,因为它会欺骗你。相反,使用 /path_to/glibc-2.23_install/bin/ldd,它应该告诉你同样的事情(它找不到 libstdc++.so.6)。

What do I need to do?

您需要安排在 /path_to/glibc-2.23_install/lib/ld-2.23.so 实际 寻找的地方找到 libstdc++.so.6

类似于:

ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /path_to/glibc-2.23_install/lib

应该可以解决问题。您可能还需要为 libgcc_s.so.1 重复此操作。