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