2010-02-10 2 views
1

Есть ли способ обнаружить и избежать, если две общие библиотеки отображают одни и те же глобальные символы сферы? Мы недавно столкнулись с ситуацией, когда у нас было libA.so, которое экспортировало SuperCoolMethod() и libB.so, которые также выставили SuperCoolMethod(), которые будут сжимать предыдущую копию указанного метода. Это на Linux, используя g ++ 4.0 и более поздние версии. Поэтому в изоляции, если вы ссылаетесь на libA.so, все будет работать так, как ожидалось, но как только libB.so был добавлен на картинке, был вызван неправильный метод, и вызов завершился неудачно, и исполняемый поток прерывается, не уведомляя нас о потенциальной проблеме. Через исчерпывающую пробную версию и ошибку мы в конце концов обнаружили, что SuperCoolMethod() получили clobbered и уведомили продавца libB.so, так что __attribute__((visibility("hidden"))) можно применить к их копии метода.Обнаружение/исключение столкновений символов g ++

ответ

0

динамическая загрузка библиотеки и прикрепление символов через dlopen и dlsym будут работать. Вам нужно будет написать код, чтобы сделать это, но если бы вы действительно действительно застряли, это было бы решением

+0

Хм, это может сработать, поскольку мы никогда не будем использовать необходимость явного вызова рассматриваемой функции, но она не говорит мне, как начать конфликт для начала. –

+0

сочетание nm и grep скажет вам – pm100

1

Поскольку это C++, библиотеки должны быть в своем собственном пространстве имен, поэтому столкновений не происходит.

+0

Должно быть, но это не так, и это от стороннего поставщика. –

+1

Если вы можете «уведомить поставщика libB.so о том, что __attribute ((видимость (« скрытый »)), вы можете запросить пространства имен, которые будут работать и с компиляторами не gnu – Mark

0

В качестве рабочего решения, если вы используете только один из двух методов, порядок, в котором они отображаются в командной строке , определяет, какую версию функции вы в конечном итоге выполняете в конечном исполняемом файле.

Это не просто артефакт, это определенное поведение, поэтому вы можете зависеть от него (пока поставщик не установит его).

Смежные вопросы