在运行时读取 libstdc++ 版本
Reading libstdc++ version at runtime
我的应用程序受到旧版libstdc++中的错误的影响,其数据损失相当严重。如何选择具有-rpath
或LD_LIBRARY_PATH
的正确库版本的补救措施是已知的,但对于部署和构建中的更改并不可靠。在自己被咬了不止一次之后,我想停止痛苦并为足够新版本的libstdc++引入运行时检查。如何访问该版本以便在部署无法使用正确版本的情况下打印大警告消息。请注意,我需要次要版本libstdc++.so.6.0.25
又名。GLIBCXX_3.4.25
GCC 8 附带的。
这是一个 Linux 程序,它只是列出了它拥有的 DSO 的绝对真实路径 加载(由 dl_iterate_phdr 枚举(是可访问的文件。 (所有 Linux 程序都加载linux-vdso.so
,这实际上不是一个文件(。
主.cpp
#include <link.h>
#include <climits>
#include <cstdlib>
#include <string>
#include <vector>
#include <iostream>
int
get_next_SO_path(dl_phdr_info *info, size_t, void *p_SO_list)
{
auto & SO_list =
*static_cast<std::vector<std::string> *>(p_SO_list);
auto p_SO_path = realpath(info->dlpi_name,NULL);
if (p_SO_path) {
SO_list.emplace_back(p_SO_path);
free(p_SO_path);
}
return 0;
}
std::vector<std::string>
get_SO_realpaths()
{
std::vector<std::string> SO_paths;
dl_iterate_phdr(get_next_SO_path, &SO_paths);
return SO_paths;
}
int main()
{
auto SO_paths = get_SO_realpaths();
for (auto const & SO_path : SO_paths) {
std::cout << SO_path << std::endl;
}
return 0;
}
对我来说,运行方式如下:
$ g++ -Wall -Wextra main.cpp && ./a.out
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25
/lib/x86_64-linux-gnu/libgcc_s.so.1
/lib/x86_64-linux-gnu/libc-2.27.so
/lib/x86_64-linux-gnu/libm-2.27.so
/lib/x86_64-linux-gnu/ld-2.27.so
现场演示
如您所见,将显示完整版本。通过一些文件名解析,您可以 可以从那里拿走它。获取整个DSO列表,按照get_SO_realpaths
, 在寻找任何libstdc++
之前,如果您愿意,可以让你检测到怪异的可能性 正在加载多个libstdc++
。
相关文章:
- 在运行时读取 libstdc++ 版本
- g++ libstdc++.so.6:从 4.8.5 升级到 GCC 版本 7.3.0 后找不到版本 'CXXABI_1.3.9'
- /lib/libstdc++.so.6:没有可用的版本信息
- Anaconda ImportError: /usr/lib64/libstdc++.so.6: 找不到版本 'GLIBCXX_3.4.21'
- libstdc++.so 在使用 Patchelf 和备用 glibc 版本时找不到
- 在CentOS 7上安装GCC 7.4.0不会更新我的LIBSTDC 版本
- 如何手动设置'libstdc++.so.6'使用哪个版本而不是使用最新版本?
- 新版本的 g++ 与旧版本的 libstdc++
- ld.so.1:protoc:fatal:libstdc++.so.6:在 Solaris 11 中找不到版本"GLIBCXX_3.4.20"
- GLIBCXX(libstdc++.so.6)与gcc版本之间的关系
- 在同一系统上有多个GCC的情况下,使用哪个版本的libstdc++.so
- 如何测试libstdc++的版本
- 如何在使用旧版本gcc的系统上动态链接到libc.so.6、libstdc++.so.6的本地副本
- 确定 libstdc++ 的版本
- 每个libstdc++版本的`__GLIBCXX__`值
- 两个使用不同libstdc++版本的静态库
- /usr/lib/x86_64-linux-gnu/libstdc++.so.6:未找到版本 CXXABI_1.3.8'
- 如何解析 /usr/lib64/libstdc++.so.6:在我的 CGAL cmake 项目中找不到版本 'GLIBCXX_3.4.15'?
- 混合libstdc++版本
- 如何修复:/usr/lib/libstdc++.so.6:未找到版本"GLIBCXX_3.4.15"