Есть ли способ обнаружить и избежать, если две общие библиотеки отображают одни и те же глобальные символы сферы? Мы недавно столкнулись с ситуацией, когда у нас было libA.so
, которое экспортировало SuperCoolMethod()
и libB.so
, которые также выставили SuperCoolMethod()
, которые будут сжимать предыдущую копию указанного метода. Это на Linux, используя g ++ 4.0 и более поздние версии. Поэтому в изоляции, если вы ссылаетесь на libA.so
, все будет работать так, как ожидалось, но как только libB.so
был добавлен на картинке, был вызван неправильный метод, и вызов завершился неудачно, и исполняемый поток прерывается, не уведомляя нас о потенциальной проблеме. Через исчерпывающую пробную версию и ошибку мы в конце концов обнаружили, что SuperCoolMethod()
получили clobbered и уведомили продавца libB.so
, так что __attribute__((visibility("hidden")))
можно применить к их копии метода.Обнаружение/исключение столкновений символов g ++
ответ
динамическая загрузка библиотеки и прикрепление символов через dlopen и dlsym будут работать. Вам нужно будет написать код, чтобы сделать это, но если бы вы действительно действительно застряли, это было бы решением
Поскольку это C++, библиотеки должны быть в своем собственном пространстве имен, поэтому столкновений не происходит.
Должно быть, но это не так, и это от стороннего поставщика. –
Если вы можете «уведомить поставщика libB.so о том, что __attribute ((видимость (« скрытый »)), вы можете запросить пространства имен, которые будут работать и с компиляторами не gnu – Mark
В качестве рабочего решения, если вы используете только один из двух методов, порядок, в котором они отображаются в командной строке , определяет, какую версию функции вы в конечном итоге выполняете в конечном исполняемом файле.
Это не просто артефакт, это определенное поведение, поэтому вы можете зависеть от него (пока поставщик не установит его).
- 1. g ++ создает несколько символов const?
- 2. Почему g ++ генерирует несколько (слабых) похожих символов?
- 3. Создание простого обнаружения столкновений
- 4. Как избежать столкновений crc16?
- 5. Функция торможения столкновений
- 6. Почему \ G в SELECT * FROM table_name \ G?
- 7. случайное возвращение (g, g) вместо (Double, g)?
- 8. g ++ управление версиями символов. Установите его в GCC_3.0 с помощью версии 4 g ++
- 9. Обнаружение столкновений
- 10. Прямое обнаружение столкновений d3js
- 11. Команда Vim-g для удаления символов в определенных столбцах
- 12. Кодирование специальных символов C++ (g ++) ('\ a', '\ b' и т. Д.)
- 13. Поиск столкновений в хеш-таблице
- 14. Обработка столкновений в хеш-таблице
- 15. Ошибки и таймер столкновений
- 16. Различаются между /{.*?}/g. и /{(.*?)}/g
- 17. g: include vs g: render
- 18. Обнаружение столкновений в mouseMoved метод
- 19. Обнаружение столкновений с массивами/списками
- 20. g ++ 4.4.x ошибка?
- 21. Пример предотвращения столкновений или помощь
- 22. список питон голос ([ 'G', 'G', 'N', 'G', 'C'])
- 23. g ++ - использует флаг «-g» для сборки, создает хорошую идею?
- 24. Предотвращение столкновений в физике единства при обратном вызове столкновений
- 25. Обнаружение столкновений с использованием массива столкновений внутри html5 canvas
- 26. Обнаружение столкновений для кругов
- 27. Быстрое обнаружение столкновений
- 28. Обнаружение столкновений и подпрыгивание
- 29. Обнаружение столкновений XNA
- 30. AS3 Обнаружение столкновений массивов
Хм, это может сработать, поскольку мы никогда не будем использовать необходимость явного вызова рассматриваемой функции, но она не говорит мне, как начать конфликт для начала. –
сочетание nm и grep скажет вам – pm100