1

我最近被一些奇怪的行为击中,导致我把头发扯掉了一点。我想我终于解决了问题并理解了原因,但希望对我的结论进行健全性检查。为了简单起见,我将跳过这个问题,只是陈述我的断言(背景故事冗长乏味)。

所有这些都发生在 OSX 和 iOS 模拟器上(我想在设备上也是如此,但我还没有测试过)。

  • dylib A:导出功能foo标记为弱。
  • foo dylib B:未标记为弱的导出功能。
  • 应用程序 X:链接到 dylib A。

应用程序运行(自动加载 dylib A)并调用foo. A::foo(请原谅符号滥用)被调用。然后应用程序加载 dylib B。 的符号foo被反弹到B::foo。随后调用fooalways call B::foo,而且foo永远不会反弹,因为 dylib B 定义foo为强。

正确的?

在我写这篇文章时,从逻辑上讲,我只能得出结论,它必须是(事实上我已经用一个例子验证了这种行为)。该行为实际上与静态链接期间发生的行为相同。令我惊讶的是,动态重新绑定实际上可能会发生,正如您可以想象的那样,如果函数可以在执行过程中部分更改实现,它可能会导致一些奇怪的行为。

operator new注意我在 dylib 中重写时遇到了这个问题。由于 libc++(隐式)导出operator new为弱,因此出现了上述情况。

据推测,如果你使用弱动态符号,那么你必须非常确定你知道你在做什么:)

4

0 回答 0