在向App Store提交iOS应用时,我收到Apple发来的以下消息:
非PIE二进制 - 可执行文件'Celly.app'不是位置 独立可执行文件。请确保您的构建设置 配置为创建PIE可执行文件。有关更多信息,请参阅 Technical Q&A QA1788 - Building a Position Independent Executable
链接上的信息说我应该执行以下操作:
在Xcode中,在“目标”部分中选择目标,然后单击 “构建设置”选项卡可查看其设置。对于iOS应用,请设置iOS 部署目标到iOS 4.3或更高版本。对于Mac应用程序,请设置OS X. 部署目标到OS X 10.7或更高版本。验证生成 位置相关代码设置为其默认值NO。验证 不创建位置独立可执行文件设置为其默认值 NO的价值
我已按照他们提供的链接中的说明进行操作,确保有关生成与位置无关的二进制文件的构建设置设置为“否”,并且还验证了我的项目的iOS部署目标是iOS 5.1。
我认为它不会影响最终产品,但我正在使用Mogenerator来创建我的Core Data托管对象。我已经验证了Mogenerator目标也具有正确的设置。
我也通过Cocoapods使用各种库,并且已经验证了每个库的设置也是正确的,并且它们都具有iOS 5.1的部署目标。
但是,即使使用这些设置,我的应用仍然是非PIE。我只能假设项目中隐藏的内容覆盖了我的构建设置并导致应用程序构建为位置相关的。我真的很不熟悉PIE的概念,所以任何有关可能导致这种情况的信息都会受到赞赏。还有其他我应该检查的地方可能会影响我的应用程序是否为PIE?我可能在我的代码中做了哪些事情可能导致我的应用程序构建非PIE?
答案 0 :(得分:0)
您可以使用otool检查每个二进制文件或库。
转到框架或应用的位置。 e.x. / [DerivedData目录] / Build / Products / Release-iphoneos
otool -hv LibraryName.framework / LibraryName
或
otool -hv AppName.app/AppName
寻找" PIE"在旗帜部分。以下是示例输出:
AppName.app/AppName (architecture armv7):
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC ARM V7 0x00 EXECUTE 45 4600 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES BINDS_TO_WEAK PIE
AppName.app/AppName (architecture arm64):
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 ARM64 ALL 0x00 EXECUTE 45 5184 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES BINDS_TO_WEAK PIE