使用 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
重复此操作。
我正在使用系统范围的 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
重复此操作。