3

使用基于 macOS Sierra GM 的新 Xcode 8 GM 构建,我重新编译了 Qt 5.7 C++ 项目,尝试启动应用程序时收到以下错误消息:

原因:没有找到合适的图片。发现:

/path/to/my/lib/libio_core.dylib:格式错误的 mach-o 图像:符号表欠载 __LINKEDIT

这不会发生在调试版本上,只会发生在发布版本上。有谁知道这意味着什么以及如何解决它?


更新:

这实际上与 Xcode 8 无关。使用 Xcode 7.3.1 构建相同的代码会产生相同的结果。似乎某些在 El Capitan 上运行良好的应用程序无法在 Sierra 上运行并因上述错误而失败。


更新 2:有关我的二进制文件中符号表的详细信息:

Load command 5
     cmd LC_SYMTAB
 cmdsize 24
  symoff 0
   nsyms 0
  stroff 12760
 strsize 8
4

2 回答 2

5

原来这是由Qt. 在库上执行任务时不带参数Qt 5.7.0调用。这会导致带有空符号表的 a。stripinstallmacOS Sierradylib

此错误将在Qt 5.7.1. strip同时,只要确保调用-S -x动态库即可。

于 2016-10-19T21:43:02.757 回答
3

我看到了一个类似的错误,我刚刚在我的情况下发现了它。我希望我的发现对你也有帮助。

所以,基本上,据我所知,当你的二进制文件有一个空的符号表时会发生这种情况(但可能还有其他情况)。您可以通过运行来检查objdump -private-headers <library>

<...>
Load command 4
     cmd LC_SYMTAB
 cmdsize 24
  symoff 0
   nsyms 0        <-- no symbols, oops
  stroff 4104
 strsize 8
<...>

链接器认为,如果符号表为空(nsyms 0),则可以说该表在文件中的偏移量为零(symoff 0)。因此,严格来说,它声称该表从二进制文件的开头开始。

显然,dyld10.12 Sierra 的新版本执行了以前版本没有执行的检查:它确保符号表完全在__LINKEDIT段内。好吧,在我们的例子中,符号表显然违反了这个约束并且dyld不在乎它是空的。


我将此称为 Apple 的错误:他们的链接器会创建格式错误的二进制文件,甚至不会发出警告。如果我是 Apple,dyld如果符号表为空,我将修改条件以忽略符号表约束。

我只能看到一种解决方法:向您的再导出库添加一个虚拟符号。

于 2016-09-09T13:47:07.353 回答