我注意到,当使用 otool
检查 Mach header 时,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 时遇到问题,因为他们的应用程序使用的框架没有使用与位置无关的代码(例如查看here)。这让我想知道当 otool 似乎从未报告框架二进制文件的 PIE 标志时,我应该如何检查我的框架是否使用位置无关代码?!它仅报告应用程序二进制文件。
这让我很困惑。希望有人能解释一下...
最佳答案
来自
#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 区别。 Dylib 和 bundle 则不然。它们始终隐式地与位置无关。
关于ios - Cocoa Touch 框架不使用与位置无关的代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57980449/