在运行时读取libstdc ++版本

时间:2018-10-24 17:12:23

标签: c++ libstdc++

在较旧版本的 libstdc ++ 中,a bug对我的应用程序造成了相当严重的数据丢失。已知如何使用-rpathLD_LIBRARY_PATH选择正确的库版本的补救措施,但对部署和构建中的更改并不可靠。在被自己咬了不止一次之后,我想停止痛苦,并引入运行时检查以获取足够新版本的 libstdc ++ 。在部署无法使用正确版本的情况下,如何访问该版本以显示较大的警告消息。请注意,我需要gcc 8随附的 minor 版本libstdc++.so.6.0.25 GLIBCXX_3.4.25

1 个答案:

答案 0 :(得分:5)

这是一个Linux程序,仅列出它具有的DSO的绝对真实路径 已加载(由dl_iterate_phdr枚举)的可访问文件。 (所有linux程序都加载linux-vdso.so,实际上不是文件)。

main.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

Live demo

如您所见,将显示完整版本。通过一点文件名解析,您 可以从那里拿走。根据{{​​1}}获取整个DSO列表, 在寻找任何get_SO_realpaths之前,您可以根据需要检测出异常情况 多个libstdc++正在加载。