我最近被一些奇怪的行为击中,导致我把头发扯掉了一点。我想我终于解决了问题并理解了原因,但希望对我的结论进行健全性检查。为了简单起见,我将跳过这个问题,只是陈述我的断言(背景故事冗长乏味)。
所有这些都发生在 OSX 和 iOS 模拟器上(我想在设备上也是如此,但我还没有测试过)。
- dylib A:导出功能
foo
标记为弱。 foo
dylib B:未标记为弱的导出功能。- 应用程序 X:链接到 dylib A。
应用程序运行(自动加载 dylib A)并调用foo
. A::foo
(请原谅符号滥用)被调用。然后应用程序加载 dylib B。 的符号foo
被反弹到B::foo
。随后调用foo
always call B::foo
,而且foo
永远不会反弹,因为 dylib B 定义foo
为强。
正确的?
在我写这篇文章时,从逻辑上讲,我只能得出结论,它必须是(事实上我已经用一个例子验证了这种行为)。该行为实际上与静态链接期间发生的行为相同。令我惊讶的是,动态重新绑定实际上可能会发生,正如您可以想象的那样,如果函数可以在执行过程中部分更改实现,它可能会导致一些奇怪的行为。
operator new
注意我在 dylib 中重写时遇到了这个问题。由于 libc++(隐式)导出operator new
为弱,因此出现了上述情况。
据推测,如果你使用弱动态符号,那么你必须非常确定你知道你在做什么:)