【问题标题】:ld warning: too many personality routines for compact unwind to encodeld 警告:对于紧凑的展开编码太多的个性例程
【发布时间】:2014-02-04 16:15:45
【问题描述】:

我拥有的 iOS 模拟器目标的链接器报告以下警告:

ld: warning: too many personality routines for compact unwind to encode

没有给出行号,也没有给出任何其他可操作的信息。谷歌搜索出现了一些Apple open source code,但我没有摸索它。

这是什么意思,我可以做些什么来解决它?

【问题讨论】:

    标签: ios-simulator ld


    【解决方案1】:

    我在C++ ABI for Itanium docs 中找到了一些信息,这些信息可以解释这意味着什么。

    个性例程是 C++(或其他语言)运行时库中的函数,用作系统展开库和特定语言异常处理语义之间的接口。

    推断,这个警告表明你在同一个二进制文件中有太多种类的异常处理,并且至少其中一种可能会失败。事实上,这正是观察到的in this question

    遗憾的是,没有明确的方法可以解决此问题,只有解决方法。您可以取消警告、删除代码、用其他语言重写代码、禁用语言的异常处理以及可能的其他操作。

    【讨论】:

      【解决方案2】:

      如果您遇到带有此警告的异常崩溃,即每个 throw 调用 ::terminate(),解决方法是使用旧的 dwarf 异常处理表。将以下标志添加到构建设置/链接/其他链接器标志

      -Wl,-keep_dwarf_unwind -Wl,-no_compact_unwind
      

      【讨论】:

        【解决方案3】:

        您可以尝试使用 -Wl,-no_compact_unwind 来消除其他链接器标志设置的警告。我认为它是无害的。

        【讨论】:

        • 我认为你是对的。可能是说存在某种性能影响,但除了按照您的建议禁用日志之外,我无能为力(任何人都提到过)。
        • 恕我直言,人们应该意识到,关闭警告并不能真正解决根本问题。我的猜测是有人认为这个警告很重要。只回答了原始问题的一部分,即如何解决它。但是,了解警告的真正含义应该很有趣。
        • 请不要那样做。此答案中的建议将完全关闭紧凑展开而不是禁用警告(包括可以以紧凑展开格式表示的情况)。
        • 该选项可能会导致异常处理在某些情况下完全失败(即会跳过捕获并终止进程)。
        【解决方案4】:

        当我的代码在设备上正确运行时,我尝试在 iOS 模拟器上运行时也遇到了这个问题。就我而言,这不是警告,而是链接器错误。

        幸运的是,我记得我在 Embedding LuaJIT 部分下的 instructions of this page 之后为 luajit 添加了两个标志以正确运行:

        -pagezero_size 10000 -image_base 100000000

        我的猜测是 image_base 地址超出了主机 CPU 的范围。

        无论如何,删除这些设置使其在我的配置中起作用。

        因此,请转到您的项目设置并查找此类硬连线值(如果不相同)。

        希望这会有所帮助,

        M

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-24
          • 1970-01-01
          • 2023-03-28
          • 2012-01-05
          • 1970-01-01
          相关资源
          最近更新 更多