Библиотека плагинов Segfault на C ++ с дублирующимися символами

У меня есть кроссплатформенное приложение C ++, которое разбито на несколько общих библиотек и загружает дополнительные функции из общих библиотек плагинов. Предполагается, что библиотеки плагинов являются автономными и функционируют сами по себе, без знания или зависимости от вызывающего приложения.

Один из плагинов содержит скопированный код из основного приложения, поэтому содержит имена символов, которые дублируют имена в движке. (Да, я знаю это'Как правило, нет-нет, но в то время, когда плагин был написан, двигатель был монолитным двоичным файлом и не могТ разделяют библиотеки.) В Windows все работает нормально. В Linux мы получали segfaults. Посмотрев на трассировку стека ошибки, она возникла в плагине при вызове функций с повторяющимся именем класса. Похоже, это было результатом того, что движок и плагин имели несколько разные версии общего кода (некоторые функциональные возможности класса были закомментированы в плагине). Как будто плагин получал этосимволы времени выполнения, связанные с двигателемс вместо своих. Мы "фиксированный" вопрос, изменивdlopenпараметры должны быть.dlopen(pFilepath, RTLD_LAZY | RTLD_LOCAL)

Но когда мы переписали движок для разделения на разделяемые библиотеки (для возможного повторного использования в плагинах), мы снова получаем ошибку segfault. И, глядя на трассировку стека, он идет от двигателя -> плагин -> двигатель.

Есть ли способ указать для компоновщика времени выполнения, чтобы он не отображал символы плагина на движок (особенно, если они определены в плагине)?

Спасибо! Matt

Отредактировано 2009-12-3

Я сначала попытался обернуть плагинс кодом в немсобственное пространство имен. Это неt работает, потому что он статически связан с библиотекой, которая также связана с движком. Версии статической библиотеки разные, так что segfault!

Затем я изменил сборку двигателя ибиблиотеки должны быть статически связаны. И когда я запускаю его, у меня больше нет проблемы. Таким образом, похоже, что это было результатом того, что символы общей библиотеки были экспортированы, а затем динамически перемещены в плагин, когда он был открыт. Но когда все из двигателяS-код находится в одном исполняемом файле, он нене экспортировать свои символы (так что это нене пытайтесь переместить плагинсимволы в двигатель).

У меня все еще есть проблема, поскольку есть распараллеленная версия программы (использующая Open-MPI), и она все еще получает segfault. Похоже, что этовсе еще экспортирует двигательсимволы и перестановка плагинаs. Это может быть связано с тем, как Open-MPI выполняет приложение.

Есть ли какие-либо флаги компоновщика, которые можно было бы использовать в разделяемой библиотеке плагина, которые бы указывали ей не динамически перемещать символы во время выполнения? Или скрыть этосимволы, чтобы они непереехать? Я'мы пробовали ("-sОпустить всю символьную информацию) но это, видимо, неизменить динамические символы (проверено с помощьюnm -D ).

Ответы на вопрос(3)

Ваш ответ на вопрос