Я попытался сформулировать проблему абстрактным образом, но в любом случае я подробно расскажу о фактических библиотеках в конце.Сложная динамическая и статическая связь с дубликатами (надстройки Firefox, WebRTC и VP8)
Динамическая библиотека Addon
статический связана с другой библиотекой WebRTC
, которая имеет некоторый код в сборке и этот код связан в WebRTC
, как объектные файлы вместе с собственными объектными файлами WebRTC
«s. Позволяет называть этот код сборки VP8
. Функции VP8
отмечены extern
внутри WebRTC
. Некоторая функция Encode()
от Addon
вызывает функции WebRTC
, которая в конечном итоге вызывает функции от VP8
.
Теперь приложение Firefox
который собирается загрузить библиотеку Addon
довольно сложна и имеет свою собственную версию (средства статически скомпонованный) библиотеки WebRTC
(назовем его WebRTC2
), но более старый.
Итак, вот проблема: если вызов Encode()
производится из приложения Firefox
, WebRTC
функции вызываются (не WebRTC2
, который является правильным) НО когда WebRTC
пытается вызвать VP8
функции, они вызываются из версия WebRTC2
(означает версию приложения WebRTC
), но не от WebRTC
.
Есть ли способ заставить WebRTC
звонить только из местной копии VP8
?
Применение Firefox
является браузер Firefox, WebRTC
библиотека WebRTC, VP8
библиотека VP8 кодек (внутри WebRTC) и Addon
мой Firefox C++ дополнения.
ОБНОВЛЕНИЕ - Подробное описание
Вот «unabstract» Описание проблемы: Так есть C++ XPCOM надстройка, которая статически связана с последней версией библиотеки WebRTC. В какой-то момент внутри надстройки выполняется вызов для кодирования кадра (метод Encode
из VP8Encoder
), и он постоянно сбой в Firefox, а также продолжает хорошо работать на тестовых программах с использованием gtest framework.
Проблема в том, что в какой-то момент внутри WebRTC имеется код сборки VP8, который вызывается для кодирования, а функции этого кода сборки объявляются как extern
в файлах реализации. Фактически, он падает на функцию vp8_intra_pred_y_ve_sse2
. Я сравнил три ассемблерных кода этой функции: один из моей версии WebRTC (используется в дополнении), второй - где отладчик разбился, а третий - из исходного кода WebRTC Mozilla.
Оказалось, что по какой-то странной причине код Mozilla вызывается вместо WebRTC надстройки (у них обоих одинаковые имена), а так как код WebRTC от Mozilla устарел, он вылетает с EXC_BAD_ACCESS.
На самом деле, попробуйте «вырезать» материал. Было бы проще понять, что вместо имен однобуквенных имен вам нужно отслеживать фактические имена (я понял это в конце, но не имею ответа на предложение). Кроме того, вы опустили множество подробностей, например, как материал создается (связан) и какой механизм загрузит материал (загрузчик Windows DLL, ld и т. Д.), Все из которых могут/будут иметь значение ... Кроме того, это не так 'На самом деле, похоже, проблема с firefox-addon, но больше похожа на проблему с общим динамическим загрузчиком ... – nmaier
Да, я согласен, что это общая проблема. Тем не менее, я обновил описание с подробностями. – peetonn