首页 > 解决方案 > Cocoa Touch 框架不使用与位置无关的代码吗?

问题描述

我注意到,在使用 检查 Mach 标头时otool,Cocoa Touch 框架从未PIE设置标志,尽管我在 Xcode 中将“生成位置相关的可执行文件”和“生成位置相关的代码”都设置为NO。不过,这是我得到的输出otool

otool -hv framework_binary
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64   ARM64        ALL  0x00       DYLIB    16       1560   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS    

如您所见,该PIE标志不存在。但是,在检查应用程序二进制文件时,PIE现在有:

otool -hv application_binary
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64   ARM64        ALL  0x00     EXECUTE    24       3088   NOUNDEFS DYLDLINK TWOLEVEL PIE

有人可以解释一下吗?

我读过很多人在将他们的应用程序上传到 App Store 时遇到问题,因为他们的应用程序使用的框架没有使用与位置无关的代码(查看示例)。otool这让我想知道,当似乎从来没有报告PIE框架二进制文件的标志时,我应该如何检查我的框架是否使用与位置无关的代码?!它只报告应用程序二进制文件。

这让我很困惑。我希望有人能解释一下这个...

标签: iosxcodedylibios-frameworksfpic

解决方案


从 <mach-o/loader.h>:

#define MH_PIE 0x200000         /* When this bit is set, the OS will
                       load the main executable at a
                       random address.  Only used in
                       MH_EXECUTE filetypes. */

注意:“仅用于 MH_EXECUTE 文件类型。”

只有可执行文件具有 PIE/非 PIE 区别。Dylibs 和 bundles 没有。它们总是隐含的与位置无关。


推荐阅读