(Это, вероятно, довольно сложная проблема, извините за это: -))
У меня проблема в том, что мне нужно загрузить плагин (совместно используемую библиотеку) в приложение, но плагин может использовать библиотеку, которая является двоичной, несовместимой с версией библиотеки, используемой приложением. Моя идея состояла в том, чтобы использовать dlmopen () и загрузить плагин в его собственное пространство имен. Я ожидаю получить две отдельные копии двоичной несовместимой библиотеки (и для любой другой общей зависимости, даже если двоичная совместима).
Кажется, это работает до некоторой степени, но при определенных обстоятельствах я получаю segfault глубоко внутри glibc, в точке, где вызываются конструкторы статических объектов (это то, что я обнаружил с помощью отладчика).
Я сделал минимальный пример для воспроизведения проблемы, которую можно найти на github: https://github.com/mhier/segregatedLinkingExample
В этом примере libxml ++ используется в качестве внешней общей библиотеки C ++, поэтому вам потребуется установить ее пакет разработки. Запустите «mk.sh» для компиляции, а затем «main». Затем произойдет сбой (по крайней мере, в Ubuntu 16.04 и 18.04). Если вы удалите «-DWITH_CRASH», он больше не будет аварийно завершать работу.
Переключатель компиляции WITH_CRASH позволяет использовать libxml ++ внутри основного исполняемого файла. Он всегда используется в библиотеке плагинов libC. Только из libxml ++ используется как в основном исполняемом файле, так и в плагине, который я вижу сбой. «Использовать» в этом контексте так же мало, как извлечь из него виртуальный класс и убедиться, что код для производного класса действительно генерируется путем реализации конструктора / деструктора. Он даже не выполняет код в плагине (кроме как через dl_init -> конструкторы статических объектов и т. Д.).
Я не могу найти много в Интернете о dlmopen. Я не нашел сообщений об ошибках, указывающих в правильном направлении. Кто-нибудь когда-либо использовал dlmopen с новым пространством имен для библиотек C ++? Любая форма ввода, как продолжить с этого момента, очень приветствуется!