Обнаружение / предотвращение столкновений символов g ++ - PullRequest
1 голос
/ 10 февраля 2010

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

Ответы [ 3 ]

1 голос
/ 10 февраля 2010

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

0 голосов
/ 10 февраля 2010

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

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

0 голосов
/ 10 февраля 2010

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

...