Чтение версии libstdc ++ во время выполнения - PullRequest
0 голосов
/ 24 октября 2018

В моем приложении ошибка в более старых версиях libstdc ++ довольно серьезная потеря данных.Способы выбора правильной версии библиотеки с помощью -rpath или LD_LIBRARY_PATH известны, но не надежны для изменений в развертывании и сборке.После того, как меня укусили не раз, я хотел бы прекратить страдания и ввести проверку времени выполнения для достаточно новой версии libstdc ++ .Как я могу получить доступ к версии, чтобы напечатать большое жирное предупреждение в случае, если при развертывании не используется правильная версия.Обратите внимание, что мне нужна minor версия libstdc++.so.6.0.25 aka GLIBCXX_3.4.25, которая поставляется с gcc 8.

1 Ответ

0 голосов
/ 28 октября 2018

Вот программа 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 демо

Как видите, полная версия появляется.С небольшим разбором имени файла вы можете взять его оттуда.Получение всего списка DSO, согласно get_SO_realpaths, перед поиском любого libstdc++ позволит вам обнаружить, если хотите, странную возможность загрузки более чем одного libstdc++.

...