我最近被一些奇怪的行为所击中,导致我把头发拉了一下。我想我终于解决了问题并理解了原因,但希望对我的结论进行健全检查。我将跳过这个问题并简单地陈述我的断言(后面的故事冗长乏味)。
这一切都发生在OSX和iOS模拟器上(我想在设备上也是如此,但我没有测试过。)
foo
。 foo
不标记为弱。 应用程序运行(dylib A自动加载)并调用foo
。 A::foo
(借口滥用符号)被称为。然后,应用程序加载dylib B. foo
的符号将反弹到B::foo
。对foo
的后续调用始终会调用B::foo
,此外foo
永远不会被反弹,因为dylib B将foo
定义为强。
正确?
在我写这篇文章的时候,逻辑上我只能得出它必须是(实际上我已经用一个例子验证了这种行为)。该行为实际上与静态链接期间发生的行为相同。令我惊讶的是,动态重新绑定实际上可能会发生,因为你可以想象,如果一个函数可以在执行过程中改变实现,它可能会导致一些奇怪的行为。
N.B。当在dylib中覆盖operator new
时我纠结了这一点。由于libc ++(隐式)导出operator new
弱,因此上面的场景出现了。
据推测,道德是如果你使用弱动态符号那么你必须非常肯定你知道你在做什么:)