畸形的mach-o图像:符号表低于__LINKEDIT



使用新的Xcode 8 GM构建在macOS Sierra的GM上,我重新编译了一个Qt 5.7 c++项目,当试图启动应用程序时,我得到以下错误信息:

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

/道路//我的/lib/libio_core.dylib:__LINKEDIT

这不会发生在调试版本中,只会发生在发布版本中。有没有人知道这意味着什么,以及如何去修复它?


更新:

这实际上与Xcode 8无关。用Xcode 7.3.1构建相同的代码会得到相同的结果。似乎有些在El Capitan上运行良好的应用不能在Sierra上运行,并因上述错误而失败。


更新2:my binary中symbol table的详细信息:

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

原来这是由Qt引起的。在lib上执行install任务时,Qt 5.7.0调用strip而不带参数。对于macOS Sierra,这将导致dylib具有空的symtab。

这个错误将在Qt 5.7.1中修复。与此同时,请确保为动态库调用strip-S -x

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

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

来检查这一点
<...>
Load command 4
     cmd LC_SYMTAB
 cmdsize 24
  symoff 0
   nsyms 0        <-- no symbols, oops
  stroff 4104
 strsize 8
<...>

Linker认为,如果符号表为空(nsyms 0),则可以说表到文件的偏移量为零(symoff 0)。因此,严格地说,它声称该表正好从二进制的开头开始。

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


我认为这是苹果的bug:他们的链接器创建了畸形的二进制文件,甚至不发出警告。如果我是Apple,我会修改dyld中的条件,如果符号表为空,则忽略符号表约束。

我能看到的只有一个解决方法:在你的重新导出库中添加一个虚拟符号。

最新更新