我试图以一种抽象的方式来阐述这个问题,但无论如何我最后都会提供有关实际库的详细信息。
动态库与在汇编中有一些代码的Addon
其他库静态链接,WebRTC
并且该代码与自己的目标WebRTC
文件一起作为目标文件链接到WebRTC
。让我们称之为汇编代码VP8
。的功能在里面VP8
标明。一些函数from调用函数,最终调用函数 from 。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++ 插件。
更新 - 详细说明
这是问题的“非抽象”描述:所以有一个 C++ XPCOM 插件,它与最新版本的 WebRTC 库静态链接。在附加组件内部的某个时刻,调用了对帧进行编码(类方法Encode
)VP8Encoder
,它一直在 Firefox 中崩溃,同时继续在使用 gtest 框架的测试程序上运行良好。
问题是,在 WebRTC 内部的某个时刻,有 VP8 汇编代码被调用以进行编码,并且该汇编代码的函数被声明为extern
在实现文件中。实际上,它在vp8_intra_pred_y_ve_sse2
功能上崩溃了。我比较了这个函数的三个汇编代码:一个来自我的 WebRTC 版本(用于附加组件),第二个 - 调试器崩溃的地方,第三个 - 来自 Mozilla 的 WebRTC 的源代码。
事实证明,出于某种奇怪的原因,调用了 Mozilla 的代码而不是加载项的 WebRTC(当然它们都具有相同的名称),并且由于 Mozilla 的 WebRTC 代码已过时,它会因 EXC_BAD_ACCESS 而崩溃。