4

将 iOS 应用程序提交到 App Store 时,我收到来自 Apple 的以下消息:

非 PIE 二进制文件 - 可执行文件“Celly.app”不是与位置无关的可执行文件。请确保您的构建设置已配置为创建 PIE 可执行文件。有关更多信息,请参阅 技术问答 QA1788 - 构建与位置无关的可执行文件

链接上的信息说我应该执行以下操作:

在 Xcode 中,在“Targets”部分选择您的目标,然后单击“Build Settings”选项卡以查看其设置。对于 iOS 应用,将 iOS 部署目标设置为 iOS 4.3 或更高版本。对于 Mac 应用程序,将 OS X 部署目标设置为 OS X 10.7 或更高版本。验证 Generate Position-Dependent Code 是否设置为其默认值 NO。验证不要创建与位置无关的可执行文件是否设置为其默认值 NO。

我已按照他们提供的链接中的说明进行操作,确保有关生成与位置无关的二进制文件的构建设置设置为“否”,并且还验证了我的项目的 iOS 部署目标是 iOS 5.1。

我认为它不会影响最终产品,但我正在使用 Mogenerator 创建我的核心数据托管对象。我已验证 Mogenerator 目标也具有正确的设置。

我还通过 Cocoapods 使用了各种库,并验证了它们每个的设置也是正确的,并且它们都具有 iOS 5.1 的部署目标。

但是,即使使用这些设置,我的应用程序仍然不是 PIE。我只能假设项目中的某个地方隐藏了一些东西,它覆盖了我的构建设置并导致应用程序被构建为位置相关的。我真的很不熟悉 PIE 的概念,所以任何关于可能导致这种情况的信息都将不胜感激。是否还有其他我应该检查的地方可能会影响我的应用程序是否为 PIE?我的代码中是否有可能导致我的应用程序构建非 PIE 的事情?

4

1 回答 1

0

您可以使用 otool 检查每个二进制文件或库。

转到框架或应用程序的位置。ex /[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

于 2015-09-10T20:32:32.783 回答