c++ - 在运行时读取 libstdc++ 版本
问题描述
我的应用程序受到旧版本libstdc++中的错误的影响,导致数据丢失相当严重。如何使用或选择正确的库版本的补救措施是已知的,但对于部署和构建的更改并不可靠。在自己被咬了不止一次之后,我想停止痛苦并为足够新的libstdc++版本引入运行时检查。如果部署未能使用正确的版本,我如何访问该版本以打印一个大的警告消息。请注意,我需要gcc 8 附带的次要版本。-rpath
LD_LIBRARY_PATH
libstdc++.so.6.0.25
GLIBCXX_3.4.25
解决方案
这是一个 linux 程序,它简单地列出了它已加载(由dl_iterate_phdr枚举)的可访问文件的 DSO 的绝对真实路径。(所有 linux 程序 load linux-vdso.so
,这实际上不是一个文件)。
主文件
#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
如您所见,出现完整版。通过一些文件名解析,您可以从那里获取它。get_SO_realpaths
在查找之前获取整个 DSO 列表可以让您检测到(如果需要)加载libstdc++
多个 DSO 的异常可能性。libstdc++
推荐阅读
- wordpress - Wocomerce - 如何在管理区域添加自定义 HTML 小部件?编辑订单,编辑产品视图?
- amazon-web-services - 在 aws route 53 中设置多个子域以暴露 Kubernetes
- php - laravel:JSON 字段与数组的比较
- sql - 创建任何视图 SQL
- java - 从html返回null的java httpservlet getparameter
- scala - 如何将异常堆栈跟踪(stderr)捕获到 Scala 中的文件
- python - 选择同一节点的元素
- azure - 将标签从资源组应用到资源的脚本
- c - 从特定点问题读取文件
- python - PyQt QTabBar 没有创建新标签