библиотеки dlmopen и C ++ - PullRequest
1 голос
/ 05 марта 2019

(Это, вероятно, довольно сложная проблема, извините за это: -))

У меня проблема в том, что мне нужно загрузить плагин (совместно используемую библиотеку) в приложение, но плагин может использовать библиотеку, которая является двоичной, несовместимой с версией библиотеки, используемой приложением. Моя идея состояла в том, чтобы использовать 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 ++? Любая форма ввода, как продолжить с этого момента, очень приветствуется!

1 Ответ

1 голос
/ 07 марта 2019

Так что, похоже, ответ не в том, чтобы сделать это.У dlmopen, похоже, есть проблемы с C ++, которые могут привести к неопределенному поведению.Предположительно нарушения ODR не полностью фиксируются пространствами имен.

Признаюсь, этот ответ является моим субъективным взглядом.Я не нашел много хороших ресурсов об использовании dlmopen для библиотек C ++.Отсюда мой вывод не использовать его, так как мне нужно, чтобы он работал надежно.Я видел очень странные эффекты, например, мой пример в вопросе снова работает, если я связываю разделяемую библиотеку с определенной сторонней библиотекой (даже без ее использования).Если бы я не мог понять эти эффекты, я бы не стал доверять решению (так как оно могло бы просто работать случайно).

dlmopen () может работать в других контекстах, например, если кто-то контролирует и приложение, и общую библиотеку и можетпроверить, правильно ли загружается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...