格式错误的机器图像:符号表欠载__LINKEDIT

时间:2016-09-08 02:36:13

标签: xcode qt macos-sierra

在macOS Sierra的GM上使用新的Xcode 8 GM,我重新编译了一个Qt 5.7 C ++项目,并且在尝试启动应用程序时收到以下错误消息:

  

原因:找不到合适的图片。找到了:

     

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

调试版本不会发生这种情况,只会发布。有没有人知道这意味着什么以及如何解决它?

更新

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

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

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

2 个答案:

答案 0 :(得分:3)

我看到了类似的错误,我刚刚在我的案例中找到了它。我希望我发现的东西也能帮到你。

所以,基本上,据我所知,当你的二进制文件有一个空的符号表(可能还有其他情况)时会发生这种情况。您可以通过运行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)。因此,严格地说,它声称表格从二进制文件的开头开始。

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

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

我只能看到一种解决方法:在您的reexport库中添加一个虚拟符号。

答案 1 :(得分:3)

原来这是由Qt引起的。在库上执行Qt 5.7.0任务时,strip调用install时没有参数。使用macOS Sierra会导致dylib带有空符号。

此错误将在Qt 5.7.1中修复。在此期间,只需确保使用strip为动态库调用-S -x